7月, 2011 のアーカイブ

C++にはC言語で使えたキャスティングとは別に、新しいキャスティングのオペレーターが4つあります。

static_cast<> – static_castは制限が付いたC言語のキャスティングの動作をします。static_castでオブジェクトがキャストされる場合、そのオブジェクトはアップキャストかダウンキャストしか出来ません(継承元となっている親クラスにキャストするか、新たに継承された子クラスにキャストするか)。C++でキャスティングする場合、基本的にはstatic_castを使う方が他のキャスティングより安全で、動作が読みやすいのでオススメです。

const_cast<> – const_castはconst変数からconstを外すか、変更可能な変数にconstを付け加えられます。基本的にconst_cast で必要な機能は自動的にされるので(関数のパラメーターをconst化など)、const_castは使う必要は無い、または使う必要が有る時はデザインを見直したほうが良い時があります。

reinterpret_cast<> – reinterpret_castはC言語のキャストと同じく、どのタイプの変数も関係なくどのタイプにもキャスティングできます。この機能はconst_castと同じく、必要がないのならstatic_castで済ませた方が安全です。

dynamic_cast<> – コレまでのキャスティングは全てコンパイル時に確認され、キャスティングができない時にはエラーが返されますが、dynamic_castはプログラム実行時に動的にキャスティングされます。dynamic_castはC++の既存のデータ型には使えず、プログラマーに作られたクラスをポインターか、参照型で使われている時にだけ使えます。キャストされるため正当な変換かどうかの確認が実行中に行われるため、もしキャスト出来ない変換だった場合はNULLポインターを返します。dynamic_castを使うためにはRTTIが必要(そのうち書き足します)。

注:今回のメモは、参考資料からのもろパクリに近いので、気になる時は参考資料のページを見てください。

C++には五つのメモリ領域(変数、オブジェクトなどを保存する領域)が有り、それぞれ違う用途と特徴が有ります。なお、この記事は簡潔に特徴を書いているので詳しい事は参考資料のページに載っています。

Stack(スタック) – スタックは自動的に作られた変数などを保存します。オブジェクト(変数)は宣言と同時に作成され、そのオブジェクトが作られたスコープから出たら破棄されます。(例:if()文の{}内で宣言されたオブジェクトは、if文の終わりと共に破棄されます)。スタックはヒープなど動的のメモリ領域に比べ構造がシンプルなので、比べると実行速度はかなり早いです。

Heap (ヒープ) – ヒープはmallocを使い動的に宣言された変数を保存するメモリ領域です。

Free Store – Free Storeはnewを使い動的に宣言された変数を保存するメモリ領域です。Newとdeleteはコンパイラによってはmallocとfreeを使い実装されていますが、HeapとFree Storeは別のメモリ領域なので、片方で作られたオブジェクトはもう片方から安全に破棄できるとは限られません。

Const (コンスタント)–  Const領域はコンパイル時に値が解る変数を保存するメモリ領域です(クラスオブジェクトはここには保存されません)。Const領域に保存されている値はプログラムが実行されている限り存在し、値の変更も出来ません。

Global (グローバル) – グローバル領域にはグローバル変数とスタティック変数がプログラムの起動時に割り当てられ、実行時に初期化されます(例:関数内のstatic変数はその関数が始めて呼ばれた時に初期化されます)。

参考元:

Guru of the week #9:

http://www.gotw.ca/gotw/009.htm