c 型変換
C 言語で型変換を行うには、変数の型を追加するだけで済みます。を変数の前に置くと、変換は双方向で行うことができます。例えば、int 型を double 型に変換したり、double 型を int 型に変換したりすることができます。 (推奨チュートリアル: c マニュアル チュートリアル )
しかし、この単純で粗雑な方法は C では不適切です。第一に、C のカスタム データ型クラスは完成できません。第二に、C 言語は任意の型の間で変換できます。たとえば、const オブジェクトへのポインタを非 const オブジェクトへのポインタに変換できます。これは非常に便利です。 for 型チェックが非常に厳しい C では明らかに無理があるため、C では独自の型変換演算子を 4 つ用意しています。
1. static_cast
は C 言語の型変換に似ており、無条件で型変換を行うことができます。アプリケーション シナリオ:
基本的な型変換。
int i = 1; double j = static_cast <double> (i);
親クラスとサブクラスのポインター間の変換。親クラス ポインターがオブジェクトを指している場合、親クラス ポインターをサブクラス ポインターに変換するのは安全ではありませんが、サブクラス ポインターを親クラス ポインターに変換するのは安全です。
class Base( ) { }; class Derived : public Base { }; Base * p1 = new Base; Derived * p2 = new Derived; Derived * p3 = static_cast <Derived *> (p1); // 不安全 Base * p4 = static_cast <Base *> (p2); // 安全
任意の型の式を void 型に変換します。
注: static_cast は、型の const 属性や volatile 属性を削除できません。また、無関係な型変換 (非基本クラスやサブクラスなど) を実行することもできません。
2.dynamic_cast
dynamic_cast はオブジェクト ポインター間の変換にのみ使用でき、変換結果を適用することもできます。クラスレベル間の上位変換を行う場合は、dynamic_cast と static_cast の効果は同じですが、下位変換を行う場合は、dynamic_cast の方が型チェック機能があり、static_cast よりも安全です。
class Base { virtual void dummy ( ) { } }; class Derived : public Base { }; Base * b1 = new Base; Base * b2 = new Derived; Derived * b3 = dynamic_cast <Derived * > (b1); // 转换失败,返回 NULL Derived * b4 = dynamic_cast <Derived * > (b2); // 转换成功 Derived & b5 = dynamic_cast <Derived & > (b1); // 转换失败(抛出异常) Derived & b6 = dynamic_cast <Derived & > (b2); // 转换成功
注: 親クラスと子クラスの間でポインターを変換する場合、親クラスには仮想関数が含まれている必要があります。
3. const_cast
は、const 属性を取り出し、型の const 属性または volatile 属性を削除し、const 型ポインタを非型に変更するために使用されます。 const型ポインタ。
const int * fun(int x, int y) { }; int * ptr = const_cast < int * > (fun(2, 3));
4. reinterpret_cast
reinterpret_cast は、バイナリ変換せずに型のみを再解釈します。アプリケーション:
変換された型は、ポインター、参照、算術型、関数ポインター、またはメンバー ポインターである必要があります。変換はビットレベルで実行されます。ポインターを整数に変換することも、整数をポインターに変換することもできます (まずポインターを整数に変換し、次に整数を元の型のポインターに変換すると、元のポインター値を取得することもできます)。ただし、32 ビット以外のインスタンスはポインターに変換できません。
通常、関数ポインター型間の変換に使用されます。
移植性は保証されません。
注: この型変換は安全ではないため、注意して使用する必要があります。
以上がC++の型変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。