static_cast 演算子
型ID の種類に基づいて 式 を式に含まれる型だけに変換します。
static_cast <type-id> ( expression )
解説
ランタイム型チェックが変換の安全を確保できるように実行されません。
static_cast の演算子は派生クラスへのポインターの基本クラスへのポインターの変換などの操作に使用できます。このような変換は常に安全ではありません。
一般にint列挙型または浮動小数点に int のような数値データ型を変換する変換に関係するデータ型を確認する場合 static_cast を使用します。static_cast の変換は dynamic_cast は static_cast がランタイム型チェックを行わないため変換 dynamic_cast ほど安全ではありません。あいまいなポインターへの dynamic_cast は何も問題ないように static_cast を返しますが失敗します ; これは危険です。dynamic_cast の変換によりも安全ですがdynamic_cast はポインターまたは参照にのみランタイム型チェックによるです。詳細については、「dynamic_cast 演算子」を参照してください。
次の例では D は B にメソッドおよびフィールドがあるため行 D* pd2 = static_cast<D*>(pb); は安全ではありません。ただし D が B すべてが常に含まれているため行 B* pb2 = static_cast<B*>(pd); は安全な変換です。
// static_cast_Operator.cpp
// compile with: /LD
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields
// and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always
// contains all of B.
}
dynamic_cast とは対照的にランタイム チェックは pb の static_cast の変換で実行されません。pb が指し示すオブジェクトは *pd2 の使用は悲惨な場合は D 型のオブジェクトではない場合があります。たとえばD クラスのメンバーである関数がB のクラスを呼び出してアクセス違反が発生する可能性があります。
dynamic_cast と static_cast の演算子はクラスの階層構造全体にポインターを移動します。ただしstatic_cast はキャストのステートメントに指定されている情報のみに依存し安全でない場合があります。次に例を示します。
// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
型 Dpd1 と pd2 のオブジェクトへの実際に pb の点が同じ値が表示されます。また同じ値を pb == 0 で取得します。
値を返すには B 型のオブジェクトではなく D の完全なクラスdynamic_cast への pb の点は十分がわかっていれば。ただしstatic_cast ではアサーションに設定される型 D のオブジェクトへの pb の点だけに依存しD で想定されるオブジェクトへのポインターを返します。
その結果static_cast は結果が未定義の暗黙の型変換の逆の操作を行うことができます。プログラマに static_cast の変換結果が安全であることを検証するために任せます。
この動作はクラス型以外の型に適用します。たとえばint から char に変換するために static_cast を使用できます。ただし発生 char は int の値を保持するのに十分なビットがない可能性があります。さらにプログラマに static_cast の変換結果が安全 であることを検証するために任せます。
または static_cast の演算子が標準変換およびユーザー定義変換を伴う暗黙の型変換の実行に使用できます。次に例を示します。
// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
}
static_cast の演算子は列挙型に明示的に整数値に変換します。整数型の値が列挙値の範囲内で下らなければ結果の列挙値は未定義です。
static_cast の演算子は変換先の型の null ポインター値は null ポインターの値に変換します。
式はstatic_cast の演算子を使用して明示的に無効を型に変換できます。コピー先の void 型はと constvolatileまたは __unaligned の属性を含めることができます。
static_cast の演算子は constvolatileまたは __unaligned の属性をキャストすることはできません。これらの属性の削除の詳細についてはconst_cast の演算子 を参照してください。
代入のガベージ コレクター上で実行されオフ キャストの問題が原因でstatic_cast を使用するとパフォーマンスに影響しないコードにある専用に正しく機能させることができます。リリース モードで static_cast を使用する場合は成功を確認するためにデバッグ ビルドで safe_cast で置き換えます。