C++の4つのキャスト
C++はC言語方式のキャストに加え、4つのキャストが存在します。C++のキャストは、以下の使用方法以外で使おうとするとコンパイルエラーを吐きます。C言語のキャストだと安全でない処理が出来てしまうのでそれを防ぐためや、どの様な目的でキャストしているかを明示化するために、以下のキャストを使用します。
……多分*1。
static_cast
double value = 3.141592; int ivalue1 = static_cast<int>(value); int ivalue2 = value; cout << "ivalue1 = " << ivalue1 << endl; cout << "ivalue2 = " << ivalue2 << endl;
ivalue1 = 3 ivalue2 = 3
暗黒的なキャスト、つまり明示的に書かなくても自動で行われるキャストを、敢えて明示的に行う時に使用します。予期せぬキャストが行われるのを防ぐために使用するといいかもしれません。
dynamic_cast
class Parent { public: void Print() { cout << "Parent" << endl; } }; class Child : public Parent { public: void Print() { cout << "Child" << endl; } };
Child child;
Parent* parent1 = dynamic_cast<Parent*>(&child);
Parent* parent2 = &child;
child.Print();
parent1->Print();
parent2->Print();
子クラスのポインタから親クラスのポインタへのキャストを行う時に使用します。これも暗黙的に行われるキャストなので、static_cast同様に予期せぬキャストが行われるのを防ぐ意味で使用するといいでしょう。
reinterpret_cast
long value = 100; int ivalue1 = reinterpret_cast<int>(&value); int* ivalue2 = reinterpret_cast<int*>(&value); //int* ivalue3 = &value; // Error cout << "ivalue1 = " << ivalue1 << endl; cout << "ivalue2 = " << *ivalue2 << endl;
ivalue1 = 0012FE98 ivalue2 = 100
ポインタの持つアドレス値を非ポインタ型の変数に代入する時や、ある型のポインタを別の型のポインタに変換する時に使用するキャストです。これらはC言語方式でも明示的に行わなければなりません。
const_cast
const char value[] = "Test"; char* value1 = const_cast<char*>(value); cout << "value = " << value << endl; cout << "value1 = " << value1 << endl; //value[1] = 'Z'; // Error value1[1] = 'Z'; cout << "value = " << value << endl; cout << "value1 = " << value1 << endl;
value = Test value1 = Test value = TZst value1 = TZst
const付きの値(定数)からconstを外す、またはconst無しの変数をconst付きにする時に使用します。constを外すのは非常に危険な行為ですが、例えば関数に定数を渡す際に使用するといった場合があるので、そういう時に使用するかもしれません。もっとも、そういう場合は大体他の方法がありますが。