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 スタイル キャストま
たは関数スタイル キャストが必要です。

このようにコンパイルエラーになります。