スタッキングゲーマーガール!.log

『スタッキングゲーマーガール!』のコンテンツ

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を外すのは非常に危険な行為ですが、例えば関数に定数を渡す際に使用するといった場合があるので、そういう時に使用するかもしれません。もっとも、そういう場合は大体他の方法がありますが。

*1:私はC++で書いた経験が非常に少ないため、これらのキャストの意図を正確には把握していません。