Cast 演算子 ()
C のみこの演算子の結果は左辺値ではありません。 この演算子の結果は、 type が参照である場合に左辺値になります。それ以外のすべての場合には、結果は右辺値になります。
以下の例では、キャスト演算子を使用して、サイズ 10 の整数配列を動的に作成しています。
#include <stdlib.h>
int main(void) {
int* myArray = (int*) malloc(10 * sizeof(int));
free(myArray);
return 0;
}
malloc ライブラリー関数は、その引数のサイズのオブジェクトを保持するメモリーを指すvoid ポインターを戻します。ステートメント int* myArray = (int*) malloc(10 * sizeof(int)) は、
以下のことを行います。- 10 個の整数を保持できるメモリーを指す void ポインターを作成します。
- その void ポインターを、キャスト演算子を使用して整数ポインターへ変換します。
- その整数ポインターを myArray に割り当てます。 配列の名前は、配列の初期のエレメントを指すポインターと同じなので、myArray は、malloc() への呼び出しによって作成されたメモリーに保管されている、10 個の整数の配列です。
C++ のみの始まり。
C++ では、キャスト式で以下も使用できます。
- 関数スタイル・キャスト
- C++ 変換演算子。static_cast など。
関数スタイルの表記は、expression の値を型 type に変換します。
expression( type )
次の例は、C スタイルのキャスト演算子、C++ 関数スタイルのキャスト演算子、および C++
キャスト演算子を使った同じ値のキャストを示しています。
#include <iostream>
using namespace std;
int main() {
float num = 98.76;
int x1 = (int) num;
int x2 = int(num);
int x3 = static_cast<int>(num);
cout << "x1 = " << x1 << endl;
cout << "x2 = " << x2 << endl;
cout << "x3 = " << x3 << endl;
}
上記の例の出力は、以下のとおりです。
x1 = 98
x2 = 98
x3 = 98
整数 x1 には、C スタイル・キャストを使用して num が明
示的に int へ変換された値が割り当てられます。
整数 x2 には、関数スタイル・キャストを使用して変換された値が割り当てられます。
整数 x3 には、static_cast 演算子を使用して変換された値が割り当てられます。キャストは、そのオペランドが左辺値の場合、有効な左辺値です。
以下の単純な代入式では、最初に右側が、指定された型に変換され、次に内側の
左側の式の型に変換され、結果が保管されます。
その値が、指定された型に変換し直されて、それが代入の値になります。
次の例では、i は char * 型です。
(int)i = 8 // This is equivalent to the following expression
(int)(i = (char*) (int)(8))
キャストに適用される複合代入演算の場合、複
合代入の算術演算子は、キャスト結果の型を使って実行され、それから、単純な代入の
場合と同じように進みます。
次の式は同等です。
また、i の型は char * です。
(int)i += 8 // This is equivalent to the following expression
(int)(i = (char*) (int)((int)i = 8))
C++ の場合は、キャスト式のオペランドには、クラス型を指定できます。オペランドにクラス型が指定された場合は、クラスにユーザー定義の型変換関数がある 任意の型にキャストすることができます。これらのキャストは、ターゲット型がクラスであれば、コンストラクターを 呼び出すことができますし、ソース型がクラスであれば、型変換関数を呼び出すことができます。 これらのキャストは、両方の条件が該当する場合は、不明瞭になります。
C++ のみの終わり。