Effective C++ Item 272009年08月12日 01時08分49秒

  • キャストは極力避ける。特に dynamic_cast は実行速度に影響が大きい。可能ならキャストが必要ない実装を模索すること。
  • もしキャストが避けられないのなら関数の中に閉じ込め、呼び出し側に余計なキャストを強制しない様にする事。
  • 古い C 型のキャストよりも新しい C++ 型のキャストを用いる事。読みやすくまた機能も特化されている。

C 言語型のキャストは以下の二種類がある。

(T) expression
T (expression)

const_cast<T> (expression)
const の制限を取り去る。
dynamic_cast<T> (expression)
継承関係内で安全なダウンキャストを行なう。ダウンキャストは基底クラスから派生クラスへのキャスト。古い C 型のキャストでは出来ない唯一のキャスト。このキャストだけは実行時の動的なコストは高い。 ダウンキャストが可能ならばダウンキャストしたポインタが、不可能ならば null が返されます。参照の場合は、ダウンキャスト不可能な時に bad_cast 例外が投げられます。
reinterpret_cast<T> (expression)
低レベルの機械、実装依存のコードを書く必要がある時の為に用いる。コンパイラに型の解釈を指示するだけで、実行時にはデータをなにも変換しないような場合に使います。例、ポインタを整数型へ。
static_cast<T> (expression)
明示的に型変換を強制する。例、void ポインタを型指定のポインタへ。

アップキャストが行なわれると、派生クラスと基底クラスのアドレスの違いが考慮される。C++ では参照する時に使う型によって同じオブジェクトのアドレスが変わることがある。単純にオブジェクトを char* 等にキャストして参照することは危険だ。

キャストが必要な時はデザインを考え直す。type-safe なコンテナか仮想関数で解決することが多い。

前回次回