Blog

C++ Revisit for Embedded Engineer – §2. キャスト演算子について

今回は、C++のキャストについてまとめたいと思います。

おさらい

C言語のキャストは以下のように記述しますが、これにはいくつかの欠点が存在します。

ひとつは、どんな型へも容易にキャストできてしまうことです。必要な情報を簡単に削ぎ落としてしまうため、constvolatile等の修飾子の情報が消滅する危険が伴います。もうひとつは、Cスタイルのキャストはすべて同じ書き方をするという点です。これには、キャストの意図を明示しないため、コードの目的を分かりづらくする欠点があります。

C++では、Cスタイルのキャストも使用できますが、以下のキャスト演算子が追加されています。

  • static_cast
  • const_cast
  • reinterpret_cast
  • dynamic_cast

static_cast演算子

static_castは、doubleintenumintなどの一般的なキャストで使用します。名前から想像できるように、static_castはコンパイル時に評価され、実行時には型変換の情報が確定します。コンパイル時にエラー・チェックも合わせて実施されるため、不正なキャストを早期に発見できるメリットもあります。コンパイラが暗黙の型変換を知らない場合、コンパイル・エラーが発生します。具体的には、以下の場合にstatic_castが成功し、それ以外ではコンパイル・エラーとなります。

  • コンパイラが暗黙の型変換を知っている
  • voidポインタから、他のポインタへの型変換

const_cast演算子

const_castは、const修飾子をはずすためのキャストで、通常は使用することはないでしょう。ただし、使用しているライブラリのインターフェイスとマッチしない場合など、特別な事情がある場合に、この演算子を使用します。

reinterpret_cast演算子

static_castによるキャストでは、コンパイラによるビット・パターンの変化が発生する場合がありますが、reinterpret_castは文字通りにビットの並びを再解釈するために使用します。他のキャスト演算子に比べ、制限がほとんんどないので、コンパイラによるエラー・チェックが期待できません。したがって、通常はなるべく多用しないようにするべきですが、以下のような事情がある場合に使用します。

  • ポインタ型から整数型への変換、またはその逆の変換
  • 違うポインタ型への変換

dynamic_cast演算子

dynamic_castは、ダウン・キャスト(基底クラスから派生クラスへの型変換)を行う場合に使用します。一般的に、派生クラスには基底クラスにないメンバ変数やメンバ関数が含まれているため、ダウン・キャストはなるべく避けたほうが良いですが、必要に迫られた場合にdynamic_castを使用します。ちなみに、他の3つのキャストはCスタイルのキャストでも置き換えることができますが、dynamic_castに対応するキャストはC言語では実現できません。また、名前の通りコンパイル時に型が決定するわけでなく、実行時にキャスト可能か判定します。したがって、実行時のオーバーヘッドを考慮する必要があります。なお、キャストできない場合はNULLポインタを返します。

まとめ

まとめると、以下のようになります。

  • const_cast、またはdynamic_castの出番か判定する。
  • static_castを使用する。
  • 上記のいずれにも当てはまらない場合は、reinterpret_castを使用する。

以上、簡単でしたがC++のキャスト演算子についてまとめました。