キャスト(型変換)

cast.png

明示的な型変換と暗黙的な型変換

暗黙的型変換…明示的に指定しなくてもコンパイラの判断によって自動的に行う型変換
明示的型変換…コードに直接書いて明示的に指定して行う型変換

Cスタイルのキャスト

int i=(int)f;

GLSLではCスタイルキャストは使っちゃだめである。

Cスタイルのキャストの欠点

  • 大規模なプログラムで簡単に見つけることができない
  • プログラマが意図している変換の種類(static_cast?reinterpret_cast?const_cast?)がはっきりとわからないので、危険。
  • 無関係な型の間で移植性の無い変換もしようと思えばできてしまう点が危険

関数スタイルのキャスト

int i=int(f);

こっちには値の構築(value construction)という意味がある。
関数スタイルのキャスト(function-style cast)と呼ばれることがある。
GLSLではこっちを使う。
組み込みデータ型なら
T(e)static_cast<T>(e)と同じ意味である。
これの良いところは、たとえばtemplaeを使ってプログラムする時、
Tが組込型データ型であろうと、ユーザ定義のデータ型であろうと同じ書き方T()が通用することである。

C++独自のキャスト

c++独自のキャストは、cのキャストよりも安全であるという存在意義がある。
これらのキャストは、いずれも何らかの方法でキャストの失敗を伝えてくれます。
dynamic_cast 以外 の3つは、コンパイルの時点で伝えてくれるので、不正なキャストを使ったプログラムは、そもそも実行することが できません。
dynamic_cast の方は、キャスト結果が NULL になっていないかを確実に調べるようにしていれば、エラーを 検出できる訳です。
これらの仕組みによって、C言語スタイルのキャストには無い、安全性を提供しています。

  • dynamic_cast
  • static_cast
  • const_cast
  • reinterpret_cast

static_cast,const_cast,reinterpret_cast

コンパイルの時点でキャストが安全かどうかを調べ、キャストできない場合には コンパイルエラーを出します。

static_cast

普通のキャスト
ポインタ型をキャストするなら、static_castじゃない他の方法を使うこと。
同じクラス階層に属するあるポインタ型から別のポインタ型
列挙から整数系データ型
浮動小数点数型から整数系データ型
など、関連する型の間の変換を行う。
コンパイラはstatic_castに対して最小限の型チェックを行うことができる。

const_cast

constを取り除くことができる!!
const や volatile を無効化するために使います。

reinterpret_cast

ポインタ型同士の変換や、int型の変数をポインタ型に変換する場合などに使います。
この変換がどのように行われるかは、環境に大きく依存するため、別の環境へプログラムを移植する場合に問題 になるかも知れません。
整数からポインタ、
ポインタから無関係なポインタ型といった関連性のない型の変換を行う。
reinterpret_castで表現されている型変換のほうがstatic_castと書いてある型変換よりも危険だとプログラマは知ることが出来る。
reinterpret_castは関数ポインタの変換で使わなければならないようなタイプの型変換である。

dynamic_cast

キャストの安全性を、コンパイル時ではなく、実行時に行います。 実行時にキャストが危険であると判断されると、キャストを許可せず結果を NULL とします。

小さい型から大きい型への変換(上位変換)

C++でVisual Studioではたとえばboolをfloatに変換するなどの時は、警告が出ません。
関数の引数をfloatが必要なのに誤ってboolを渡してしまったら、なんの警告もなくコンパイルされてデバッグが厄介です。
警告レベルを変えるには

プロパティ->C/C++->全般->警告レベル

です。

サポートサイト Wikidot.com