「キャスト」の版間の差分

提供: 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 = &sub;

サブクラスは、親クラスのメンバをすべて引き継いでいるため、アップキャストは、安全です。

アップキャスト

継承関係の子から親へ向かうキャストです。

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);

関連項目