C++の基礎 - キャスト

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

static_cast

ある型からある型への暗黙の変換が存在する時(例 : int型からdouble型へ変換)、そこで暗黙の変換が行われることを明示する場合に使用する。

 double d = 3.14;
 int i = static_cast<int>(d);



dynamic_cast

親クラスのポインタを子クラスのポインタにキャストする時に使用する。
その際、その親クラスのポインタが指すオブジェクトの実体が、キャスト先のクラスであることを確認する。
ポインタが指す実体が、キャスト先のクラスまたはその子孫クラスである場合はポインタはそのまま使われるが、
キャスト先のクラスとして使用できない場合には、NULL(nullptr)に置き換えられる。

 Child0 child00;
 Parent* parent = &child0;
 
 // Child1* child1 = parent;  <- コンパイルエラー

 // child1はchild1にキャストされる
 Child1* child01 = dynamic_cast<Child1*>(parent);
 std::cout << "child1 : " << child1 << std::endl;
 std::cout << "child1->name() : " << child1->name() << std::endl;
 
 // child2はnullptrとなる
 Child2* child2 = dynamic_cast<Child2*>(parent);
 std::cout << "child2 : " << child2 << std::endl;


dynamic_castを行うためには、型情報がポインタから得られる必要がある。
つまり、クラスはポリモーフィックである必要がある。
親クラスは最低でも1つのvirtualな関数が親クラスに定義されていて、vtableが存在しなくてはならない。


reinterpret_cast

ポインタ型を他のポインタ型に強制的に変換する。
dynamic_castと違うのは、ポインタの型変換が安全に行えるかは考慮されない。
また、整数型(int、long、long long等)を任意の型のポインタに変換するのにも利用できる。

 int i;
 char *c = reinterpret_cast<char*>(&i);
 c[0] = 1;
 c[1] = 1;
 
 // 257 in little-endian.
 std::cout << "i : " << i << std::endl;
 long addrint = reinterpret_cast<long>(c);
 std::cout << "addrint : " << addrint << std::endl;



const_cast

constを付加するまたは外す時に使用する。
C++ではconst_castを使用してconstを外すことができるが、constは変数を定数として扱うことを表しているので、解除するのは問題がある。
互換性の問題でどうしても使わざるを得ない場合以外では使うべきではない。