ホームページ  >  記事  >  バックエンド開発  >  C++の型変換

C++の型変換

angryTom
angryTomオリジナル
2019-10-26 11:02:085669ブラウズ

C++の型変換

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:C++の基礎知識次の記事:C++の基礎知識