「キャスト」の版間の差分
提供: C++入門
(ページの作成:「C++におけるキャスト (cast)とは、型変換です。誤ったキャストは、プログラムの動作が保証できなくなるため、コンパイル...」) |
(→関連項目) |
||
行66: | 行66: | ||
* [[reinterpret_cast]] | * [[reinterpret_cast]] | ||
* [[static_cast]] | * [[static_cast]] | ||
− | <!-- vim: filetype=mediawiki --> | + | <!-- vim: filetype=mediawiki |
+ | --> |
2018年4月21日 (土) 11:45時点における最新版
C++におけるキャスト (cast)とは、型変換です。誤ったキャストは、プログラムの動作が保証できなくなるため、コンパイルを通すための無理な型変換はやめましょう。C++では、C言語風のキャストとC++で追加されたキャスト構文があります。
読み方
- キャスト
- きゃすと
- cast
- きゃすと
概要
C++で追加されたキャスト構文は、以下の通りです。
dynamic_cast以外は、コンパイル時に評価されます。
ダウンキャスト
継承関係の親から子へ向かうキャストです。
class BaseClass {}; class SubClass : public BaseClass {}; SubClass sub; BaseClass *bp = ⊂
サブクラスは、親クラスのメンバをすべて引き継いでいるため、アップキャストは、安全です。
アップキャスト
継承関係の子から親へ向かうキャストです。
class BaseClass {}; class SubClass : public BaseClass {}; BaseClass b; SubClass *sp = &b;;
const_cast
const_castは、constやvolatileを無効化するために使用します。
const int *cp = NULL; int *p = const_cast<int*>(cp);
static_cast
static_cast(静的なキャスト)は、一般的なキャストを行います。intからlong、intからdouble、列挙型からintなどの型変換です。 int*からchar*などのポインタ型の変換は行えません。 ポインタ同士のキャストには、reinterpret_castを使用します。
int i = 0; double d = 1.2; i = static_cast<int>(d);
コンパイル時に評価され、キャストできない場合は、コンパイルエラーになります。
dynamic_cast
dynamic_cast(動的なキャスト)は、安全にダウンキャストを行います。正しくないポインタを指定してダウンキャストしたとき、キャストの結果は NULL となります。参照を使用したダウンキャストが失敗した場合は、例外 std::bad_castが送出されます。
reinterpret_cast
reinterpret_cast(再解釈キャスト)は、異なる型同士のキャストで使用します。ポインタ型同士の変換、int型からポインタ型への変換で用いられます。
int address = 0x00ff; MyClass *p = reinterpret_cast< MyClass * > (address);