Cast 演算子 ()

構文図を読む構文図をスキップする
Cast 式の構文 

>>-(--type--)--expression--------------------------------------><

C
のみ C のみこの演算子の結果は左辺値ではありません。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++ では、キャスト式で以下も使用できます。
  • 関数スタイル・キャスト
  • 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 演算子を使用して変換された値が割り当てられます。
キャストは、そのオペランドが左辺値の場合、有効な左辺値です。 以下の単純な代入式では、最初に右側が、指定された型に変換され、次に内側の 左側の式の型に変換され、結果が保管されます。 その値が、指定された型に変換し直されて、それが代入の値になります。 次の例では、ichar * 型です。
(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++ C++ のみの終わり。