キャスト演算子は、明示的型変換 のために使用されます。 この演算子は、次のような形式です。ここで、T は型、expr は式です。
( T ) expr
これは expr の値を、型 T に変換します。C の場合は、この操作の結果は左辺値ではありません。 C++ では、T が参照である場合、この演算の結果は左辺値です。 それ以外の場合は、結果は右辺値です。
このセクションでのここから先の説明は、C++ だけに適用されます。
キャストは、そのオペランドが左辺値であれば、有効な左辺値です。 次の単純な代入式では、まず最初に右側が指定の型に変換され、次に左側内部の式の型へと変換さ れて、結果が 保管されます。 値は、指定された型に変換され、代入の値となります。 次の例では、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))
左辺値キャストのアドレスの取得は機能しません。その 理由は、アドレス演算子をビット・フィールドに適用できないためです。
次の関数スタイルの表記を使用して、expr の値を型 T に変換することも可能です。
expr( T )
引き数を取らない関数スタイルのキャスト (X() など) は、 宣言 X t() に等価です。ここで、t は、一時オブジェクトです。 同様に、複数の引き数 (X(a, b) など) を持つ関数スタイルのキャストは、 宣言 X t(a, b) に等価です。
C++ の場合は、オペランドには、クラス型を指定できます。オペランドにクラス型が指定された場合 は、クラスにユーザー定義の型変換関数がある任意の型にキャストすることが できます。これらのキャストは、ターゲット型がクラスであれば、コンストラクターを 呼び出すことができますし、ソース型がクラスであれば、型変換関数を呼び出すことができます。 これらのキャストは、両方の条件が該当する場合は、不明瞭になります。
明示的型変換は、C++ 型変換演算子 static_cast を使用することによっても表現できます。
例
以下は、キャスト演算子の使用法を示したものです。 この例では、サイズ 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)) は、 以下のことを行います。
関連参照