ホームページ  >  記事  >  バックエンド開発  >  C++_Basic の使用法と使用シナリオにおける 4 種類のキャスト

C++_Basic の使用法と使用シナリオにおける 4 種類のキャスト

php是最好的语言
php是最好的语言オリジナル
2018-08-01 14:20:393570ブラウズ

C での型変換:

まずは C 言語から始めましょう。私たちは C のような型変換が強力であるため、使い慣れています。

には主に 2 つの形式があります:

  • (new-type)expression

  • new-type (expression)

#C スタイルの変換形式は非常に単純ですが、多くの欠点があります:

1. 変換があまりにも恣意的であり、任意の型間で変換できます。 const オブジェクトへのポインタを非 const オブジェクトへのポインタに変換したり、基底クラス オブジェクトへのポインタを派生クラス オブジェクトへのポインタに変換したりできます。これらの変換間のギャップは非常に大きくなりますが、従来の C 言語では-style キャストではこれらを区別しません。

2.C スタイルの変換には、統一されたキーワードと識別子がありません。大規模なシステムの場合、コードのトラブルシューティングを行うときに見落としたり無視したりすることがよくあります。

C:

C スタイルの型変換は、上記 2 つの問題を完全に解決します。 1. 型変換が細分化され、さまざまなニーズの変換をサポートするために 4 種類の変換が提供されています; 2. 型変換には統一された識別子があり、コードのトラブルシューティングや検査に便利です。 static_cast、dynamic_cast、const_cast、reinterpreter_cast の 4 つの変換を以下に紹介します。

  • static_cast という名前は、静的型変換であると理解されます。 int から char への変換など。

  • dynamic_cast という名前は、動的型変換であると理解されます。サブクラスと親クラス間のポリモーフィックな型変換など。

  • const_cast は、文字通り const 属性を削除することを意味します。

  • reinterpreter_cast は型を再解釈するだけで、バイナリ変換は実行しません。

1. static_cast 変換

1.

基本的な使い方: static_cast 式

2.

使用シナリオ:

a. クラス階層内の基本クラスと派生クラス間のポインターまたは参照の変換に使用されます

上流変換 (派生クラス-->基本クラス) ) は安全ですが、

ダウンキャスト (基本クラス --> 派生クラス) は、動的な型チェックがないため安全ではありません。

b. int から char への変換など、基本的なデータ型間の変換に使用されます。これはセキュリティ上の問題を引き起こすため、プログラマが確認する必要があります

c. null ポインタを次の null ポインタに変換します。ターゲット型

d. 任意のタイプの式を void 型に変換します

3.

使用機能

a. 主に非ポリモーフィックな変換操作を実行します。 C

の通常の変換操作を置き換えるために使用されます b. static_cast を使用して暗黙的な変換を示し、置き換えることをお勧めします

int n = 6;double d = static_cast<double>(n); // 基本类型转换int *pn = &n;double *d = static_cast<double *>(&n) //无关类型指针转换,编译错误void *p = static_cast<void *>(pn); //任意类型转换成void类型

2. Dynamic_cast 変換

1.

基本的な使用法:dynamic_cast式

2.

使用シナリオ:派生クラス間で変換する場合にのみdynamic_castを使用します。type -idはクラスポインタ、classである必要があります。参照または void*。

3.

使用上の特徴:

a. Dynamic_cast は実行時の型チェックであり、実行時の型情報とこの情報を必要とするため、基本クラスには仮想関数が必要です。これは、クラスの仮想関数テーブルに格納されます。仮想関数を定義するクラスのみが仮想関数テーブルを持ちます (クラスに仮想関数がない場合、一般的に、このクラスの設計者は仮想関数テーブルを必要としません)それが基本クラスになります)。

b. 下方変換の場合、dynamic_cast は安全です (型が一致しない場合、変換されたポインタは null ポインタになります)、static_cast は安全ではありません (型が一致しない場合、変換されたポインタはヌル ポインタになります)。間違った意味)、メモリの踏みつけや不正アクセスなど様々な問題を引き起こす可能性があります)

c.dynamic_cast は相互変換も実行できます

class BaseClass 
{public:
  int m_iNum;
  virtual void foo(){};//基类必须有虚函数。保持多台特性才能使用dynamic_cast};class DerivedClass: public BaseClass 
{public:
  char *m_szName[100];
  void bar(){};
};
  
BaseClass* pb = new DerivedClass();
DerivedClass *pd1 = static_cast<DerivedClass *>(pb);//子类->父类,静态类型转换,正确但不推荐DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);//子类->父类,动态类型转换,正确BaseClass* pb2 = new BaseClass();//父类->子类,静态类型转换,危险!访问子类m_szName成员越界DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);//父类->子类,动态类型转换,安全的。结果是NULLDerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);

3.const_cast 変換

1.

基本的な使用法: const_castexpression

2.

使用シナリオ:

a. 定数ポインターを非定数ポインターに変換します。 b. 定数参照は非 const 参照に変換され、依然として元のオブジェクトを指します

3.

使用機能

:

a. cosnt_cast 4 つの型変換演算子の中で定数を操作できる唯一の変換演算子です

b. 定数性の削除は危険な行為ですので、使用は避けてください。具体的なシナリオは次のとおりです。クラスが const を介してオーバーロードを提供する場合、非 const 関数は通常、const_cast を呼び出してパラメータを定数に変換し、次に定数関数を呼び出して結果を取得し、次に const_cast を呼び出して const 性を削除します。

struct SA 
{
  int i;
};const SA ra;//ra.i = 10; //直接修改const类型,编译错误SA &rb = const_cast<SA&>(ra);
rb.i = 10;

4. reinterpret_cast 変換

1.基本的な使用法

: reinterpret_castexpression

2.使用シナリオ

: この変換文字は最後の手段、リスクの高い操作として使用しないでください

3.使用機能

:

a. reinterpret_cast はデータを下から再解釈します特定のプラットフォームは移植性が低い

b. Reinterpret_cast は整数をポインタに、ポインタを配列に変換できます

c. Reinterpret_cast はポインタと参照で不正な変換を実行できます

int doSomething(){return 0;};//FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 voidtypedef void(*FuncPtr)();//10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存//入funcPtrArray数组:FuncPtr funcPtrArray[10];

funcPtrArray[0] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArrayfuncPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函数指针类型之间进行转换

总结:

去const属性用const_cast。

基本类型转换用static_cast。

多态类之间的类型转换用daynamic_cast。

不同类型的指针类型转换用reinterpreter_cast。

相关文章:

C++ 的强制类型转换

【c#教程】C# 类型转换

相关视频:

PHP数据类型转换之自动类型转换

以上がC++_Basic の使用法と使用シナリオにおける 4 種類のキャストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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