C++ で static_cast コマンドを使用する
この記事では、C++ で static_cast
を使用する方法に関する複数の方法を示します。
C++ で static_cast
を使用してオブジェクトのタイプを明示的に変換する
オブジェクトを別のタイプに変換する操作は、キャスト
と呼ばれます。配列からポインタへの減衰など、言語規則に従って C++ で暗黙的な変換が発生する場合があります。それでも、キャストは主にユーザーが行う明示的な変換要求に関連付けられています。オブジェクトまたは式の値を別の型にキャストすると、コンパイラーは、指定された型をオブジェクトを指すポインターに関連付けるように強制されます。
名前付きの明示的なキャスト操作には、const_cast
、static_cast
、reinterpret_cast
、および dynamic_cast
の 4つがあります。これらの操作は最新の C++ 言語にネイティブであり、古い C スタイルのキャストよりも比較的読みやすくなっています。キャストはしばしば危険であり、経験豊富なプログラマーでさえそれらを間違えますが、必要なときにこれらの変換操作を利用することを思いとどまらせるべきではありません。この記事では、static_cast
および reinterpret_cast
操作の概要のみを説明します。
static_cast
関数は通常、関連する型を同じクラス階層または数値型のポインタとして相互に変換するために使用されます。このコマンドは、コンストラクターと変換演算子によって定義された変換も処理します。main
関数の 2 行目は、基本的に、符号付き char
から符号付き整数への暗黙的なキャストを実行していることに注意してください。これは、次の行のあいまいなバージョンのほんの一部です。
結果は同じですが、これは最新の C++ でキャストを実行するための推奨される方法です。一方、main
関数の 4 行目と 5 行目は、static_cast
操作を使用した有効な変換ではありません。ただし、後者の変換は、C スタイルのキャスト (int*)x
を使用して強制できます。これは、97
整数値を 16 進形式とメモリアドレス表記で出力します。この操作により、コンパイラの警告が生成される可能性が高いことに注意してください。
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int x_i = x;
int x_ii = static_cast<int>(x);
int* x_iii = static_cast<int*>(x); // ERROR
int* x_iii = static_cast<int*>(&x); // ERROR
int* x_iii = (int*)x; // WARNING
cout << x << endl;
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
出力:
a
97
97
0x61
0x7ffeb7c31997
C++ で reinterpret_cast
を使用してオブジェクトのタイプを明示的に変換する
または、後者の C スタイルのキャストは、次のコード例に示す reinterpret_cast
操作を使用して実行できます。このメソッドはコンパイラの警告を消し、ユーザーが変換の責任を負うことができます。char*
のような reinterpret_cast
を使用して、さまざまなポインタタイプを int*
に変換できます。
この場合、出力されるアドレスは、x
文字が格納されているアドレスと同じです。値にアクセスするために x_iii
ポインタを逆参照すると、文字 a
またはその ASCII 代替文字は取得されず、奇妙な整数が取得されることに注意してください。この整数は同じ場所から取得されます。int
として解釈されるため、データ型のサイズのみが異なります。
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int* x_i = (int*)x; // WARNING
int* x_ii = reinterpret_cast<int*>(x);
int* x_iii = reinterpret_cast<int*>(&x);
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
出力:
0x61
0x61
0x7ffca18be95f