static_cast
http://www.geocities.jp/ky_webid/cpp/language/024.html
ごくごく一般的なキャストを提供する。
静的キャストともいいます。また、dynamic_castは動的キャストともいいます。
でこのstatic_castでどんなキャストができるかですか、C言語のキャストと同じような普通のキャストができます。
#include <iostream> using namespace std; int main () { double d = 10.9; int i = static_cast<int>( d ); cout << i << endl; return 0; }
$ main 10
C言語のキャストとの違いとしては、コンパイラから見て、明らかにおかしいと思われるキャストを行ったときにはコンパイルエラーになります。
まずC言語的な普通のキャストを見てみましょう。
#include <iostream> using namespace std; int main () { int i = 10; int* p = (int*)i; // intをint*へキャストしている! cout << *p << endl; return 0; }
これを実行するとプログラムが落ちます。なんせint型の変数を無理やりint*型へキャストしてるわけですからそれを間接参照したら不正な値になるのは当然の結果です。
こういうミスを防ぐためにstatic_castが存在しています。
static_castを使えばこのような明らかに不正な型へのキャストをコンパイル時にエラーにしてくれる優れものなのです。
#include <iostream> using namespace std; int main () { int i = 10; int* p = static_cast<int*>( i ); cout << *p << endl; return 0; }
$ cl /W4 /EHs main.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp main.cpp(6) : error C2440: 'static_cast' : 'int' から 'int *' に変換できません。 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストま たは関数スタイル キャストが必要です。
このようにコンパイルエラーになります。