C++ でのキャスト

黄舟
黄舟オリジナル
2017-02-06 13:43:521904ブラウズ

Q:C スタイル変換とは何ですか? static_cast、dynamic_cast、reinterpret_cast とは何ですか?違いは何ですか?なぜ注意を払う必要があるのでしょうか?


A: 変換の意味は、変数の型を別の型に変更することによって、変数の表現を変更することです。ある単純なオブジェクトを別の単純なオブジェクトにキャストするには、従来の型変換演算子を使用します。


たとえば、double float 型のポインタを整数に変換するには:

コード

int i;
double d;
i = (int) d;


または:

i = int (d);


標準定義の変換を使用した単純な型に対して機能します。ただし、このような変換演算子は、クラスとクラス ポインターに無差別に適用することもできます。 ANSI-C++ 標準では、「reinterpret_cast」、「static_cast」、「dynamic_cast」、および「const_cast」という 4 つの新しい変換演算子が定義されており、これらはクラス間の型変換を制御するように設計されています。


コード:

reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)


1 reinterpret_cast


reinterpret_castは、ポインタを他の型のポインタに変換します。ポインタから整数型への変換も可能です。逆に。 (注釈: ポインターの特定のアドレス値は整数値ですか?)


この演算子は、無関係な型の間で変換できます。操作の結果は、あるポインターから別のポインターへの値の単純なバイナリ コピーです。型間で指されるコンテンツは、型のチェックや変換を受けません。ポインタから整数へのコピーの場合、内容の解釈はシステムに依存するため、便利な実装はありません。ポインターを含めるのに十分な大きさの整数に変換されたポインターは、有効なポインターに変換して戻すことができます。


コード:

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);


reinterpret_cast は、すべてのポインター型変換を従来の型変換と同様に扱います。


2 static_cast


static_cast を使用すると、任意の暗黙的な変換と逆変換を実行できます。 (暗黙的であることが許可されていない場合でも)


は、サブクラス型のポインターを親クラス型のポインターに変換できることを意味し (これは有効な暗黙的な変換です)、同時に同時に、逆のアクション、つまり親クラスをそのサブクラスに変換することもできます。この最後の例では、変換された親クラスは宛先の型との整合性がチェックされません。


コード:

class Base {};
class Derived : public Base {};
 
Base *a = new Base;
Derived *b = static_cast<Derived *>(a);


static_cast 型ポインターの操作に加えて、static_cast を使用して、型定義の明示的な変換や、基本型間の標準変換を実行することもできます。

double d = 3.14159265;
int i = static_cast<int>(d);


3 Dynamic_cast


dynamic_cast は、オブジェクトのポインターと参照にのみ使用されます。多態性型で使用すると、任意の暗黙的な型変換が可能になり、またその逆も可能になります。ただし、static_cast とは異なり、後者の場合 (注: 暗黙的な変換の逆のプロセス)、dynamic_cast は操作が有効かどうかをチェックします。つまり、変換によって、要求された有効な完全なオブジェクトが返されるかどうかがチェックされます。


検出は実行時に行われます。変換されるポインターが要求された有効な完全なオブジェクト ポインターではない場合、戻り値は NULL になります。 bad_cast 例外タイプがスローされます:


コード:

class Base { virtual dummy() {} };
class Derived : public Base {};
 
Base* b1 = new Derived;
Base* b2 = new Base;
 
Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns &#39;NULL&#39;

4 const_cast

この変換タイプは、渡されたオブジェクトの const 属性を操作し、設定または削除します:

コード:

class Base { virtual dummy() {} };
class Derived : public Base { };
 
Base* b1 = new Derived;
Base* b2 = new Base;
 
Derived d1 = dynamic_cast<Derived &*>(b1); // succeeds
Derived d2 = dynamic_cast<Derived &*>(b2); // fails: exception thrown

他の 3 つの演算子はオブジェクトの定常性を変更できません。注: 「const_cast」は、型の volatile 修飾子を変更することもできます。


C++ の 4 つのキャスト形式はそれぞれ、特定の目的に適しています


dynamic_cast は主に「安全なダウンキャスト」を実行するために使用されます。つまり、オブジェクトがオブジェクト内の特定の型であるかどうかを判断します。継承システム。これは、古い形式の構文では実行できない唯一のキャストであり、実行時に多大なコストがかかる可能性がある唯一のキャストです。

static_cast は、暗黙的な変換 (たとえば、非 const オブジェクトから const オブジェクトへ、int から double など) を強制するために使用でき、また、そのような変換の多くを逆にするために使用することもできます (たとえば、 void* ポインターは変換されます)ただし、const オブジェクトを非 const オブジェクトに変換することはできません (const_cast のみが実行できます)。これは C スタイルの変換に最も近いものです。

const_cast は通常、オブジェクトの定常性を強制的に削除するために使用されます。これは、これを実行できる唯一の C++ スタイルのキャストです。

reinterpret_cast は、ポインタを整数にキャストするなど、実装に依存する (つまり、移植性のない) 結果をもたらす低レベルのキャストを目的としています。このようなキャストは、低レベル コード以外では非常にまれです。


上記は C++ での強制型変換の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

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