static_cast 演算子static_cast Operator

変換、の型に型 id、 式に存在する型のみに基づいて。Converts an expression to the type of type-id, based only on the types that are present in the expression.

構文Syntax

static_cast <type-id> ( expression )

RemarksRemarks

標準 C++ では、変換の安全性を確認する実行時の型チェックはありません。In standard C++, no run-time type check is made to help ensure the safety of the conversion. C++/CX では、コンパイル時チェックと実行時チェックが実行されます。In C++/CX, a compile time and runtime check are performed. 詳細については、「 キャストで定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Casting.

Static_cast演算子は派生クラスへのポインターを基底クラスへのポインターに変換するなどの操作に使用できます。The static_cast operator can be used for operations such as converting a pointer to a base class to a pointer to a derived class. このような変換は、必ずしも安全であるとは限りません。Such conversions are not always safe.

一般的に使用するstatic_cast列挙型などの数値データ型を整数または浮動小数点と整数に変換するときのデータ型の特定のものが、変換に関係します。In general you use static_cast when you want to convert numeric data types such as enums to ints or ints to floats, and you are certain of the data types involved in the conversion. static_castの変換はほど安全dynamic_cast変換では、ためstatic_cast中は実行時の型チェック、 dynamic_castします。static_cast conversions are not as safe as dynamic_cast conversions, because static_cast does no run-time type check, while dynamic_cast does. A dynamic_castあいまいなポインターは失敗し中、 static_cast何も問題があります。 これは、危険な場合に返されます。A dynamic_cast to an ambiguous pointer will fail, while a static_cast returns as if nothing were wrong; this can be dangerous. Dynamic_cast変換は安全なdynamic_castのみポインターまたは参照、および実行時の型チェックの動作がのオーバーヘッドが発生します。Although dynamic_cast conversions are safer, dynamic_cast only works on pointers or references, and the run-time type check is an overhead. 詳細については、次を参照してください。 dynamic_cast Operatorします。For more information, see dynamic_cast Operator.

次の例では、D* pd2 = static_cast<D*>(pb);D にないフィールドとメソッドがあるため、行 B は安全ではありません。In the example that follows, the line D* pd2 = static_cast<D*>(pb); is not safe because D can have fields and methods that are not in B. ただし、B* pb2 = static_cast<B*>(pd); には D のすべてが常に含まれているため、行 B は安全な変換です。However, the line B* pb2 = static_cast<B*>(pd); is a safe conversion because D always contains all of B.

// 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で実行時のチェックは行われません、 static_castへの変換pbします。In contrast to dynamic_cast, no run-time check is made on the static_cast conversion of pb. pb によってポイントされるオブジェクトは、型 D のオブジェクトではない場合があります。その場合は、*pd2 を使用すると、深刻な結果が発生する可能性があります。The object pointed to by pb may not be an object of type D, in which case the use of *pd2 could be disastrous. たとえば、D クラスではなく、B クラスのメンバーである関数を呼び出すと、アクセス違反が発生する可能性があります。For instance, calling a function that is a member of the D class, but not the B class, could result in an access violation.

Dynamic_caststatic_cast演算子は、クラス階層全体にポインターを移動します。The dynamic_cast and static_cast operators move a pointer throughout a class hierarchy. ただし、 static_cast cast ステートメントで提供される情報に排他的に依存しはそのため安全できません。However, static_cast relies exclusively on the information provided in the cast statement and can therefore be unsafe. 例:For example:

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

pbD 型のオブジェクトを実際に指し示している場合、pd1 および pd2 は同じ値になります。If pb really points to an object of type D, then pd1 and pd2 will get the same value. また、pb == 0 の場合、同じ値も取得します。They will also get the same value if pb == 0.

場合pb型のオブジェクトを指すBとが完全なDクラスしdynamic_cast十分 0 を返すことがわかります。If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. ただし、 static_castプログラマのアサーションに依存するpb型のオブジェクトを指すD、単にその想定されるポインターを返しますDオブジェクト。However, static_cast relies on the programmer's assertion that pb points to an object of type D and simply returns a pointer to that supposed D object.

その結果、 static_cast暗黙的な変換の逆を行うことができます、この場合、結果は定義されていません。Consequently, static_cast can do the inverse of implicit conversions, in which case the results are undefined. 結果、プログラマがいることを確認する左は、 static_cast変換が安全です。It is left to the programmer to verify that the results of a static_cast conversion are safe.

この動作は、クラス型以外の型にも適用されます。This behavior also applies to types other than class types. たとえば、 static_castから int に変換するために使用できる、 charします。For instance, static_cast can be used to convert from an int to a char. ただし、その結果、 char全体を保持するために十分なビットがない可能性がありますint値。However, the resulting char may not have enough bits to hold the entire int value. ここでも、これは左ことを確認するプログラマからの結果、 static_cast変換が安全です。Again, it is left to the programmer to verify that the results of a static_cast conversion are safe.

Static_cast演算子が標準変換とユーザー定義の変換を含む、暗黙の変換を実行することもできます。The static_cast operator can also be used to perform any implicit conversion, including standard conversions and user-defined conversions. 例:For example:

// 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演算子が列挙型を整数値を明示的に変換できます。The static_cast operator can explicitly convert an integral value to an enumeration type. 整数型の値が列挙値の範囲内にない場合、結果の列挙値は未定義になります。If the value of the integral type does not fall within the range of enumeration values, the resulting enumeration value is undefined.

Static_cast演算子は、null ポインターの値を変換先の型の null ポインター値に変換します。The static_cast operator converts a null pointer value to the null pointer value of the destination type.

任意の式は、void 型に明示的に変換できる、 static_cast演算子。Any expression can be explicitly converted to type void by the static_cast operator. 変換先の void 型を含めることができます必要に応じて、 const揮発性、または _ _unaligned属性。The destination void type can optionally include the const, volatile, or __unaligned attribute.

Static_cast演算子はキャストできません、 const揮発性、または _ _unaligned属性。The static_cast operator cannot cast away the const, volatile, or __unaligned attributes. 参照してくださいconst_cast 演算子については、これらの属性を削除します。See const_cast Operator for information on removing these attributes.

C +/CLI CLI: 次のように再配置を行うガベージ コレクターの使用の先頭で unchecked キャストを実行する危険性のためstatic_cast限定すべきパフォーマンス クリティカルなコードで正しく機能することを確認します。C++/CLI: Due to the danger of performing unchecked casts on top of a relocating garbage collector, the use of static_cast should only be in performance-critical code when you are certain it will work correctly. 使用する場合static_castリリース モードで置き換えるsafe_castデバッグ ビルドで成功を確実にします。If you must use static_cast in release mode, substitute it with safe_cast in your debug builds to ensure success.

関連項目See also

キャスト演算子Casting Operators
キーワードKeywords