C++_Basic の使用法と使用シナリオにおける 4 種類のキャスト
C での型変換:
まずは C 言語から始めましょう。私たちは C のような型変換が強力であるため、使い慣れています。
には主に 2 つの形式があります:
(new-type)expression
new-type (expression)
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_castexpression2.使用シナリオ
: この変換文字は最後の手段、リスクの高い操作として使用しないでください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++_Basic の使用法と使用シナリオにおける 4 種類のキャストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、CのNull Poernter recerferenceの課題を調査します。問題は、問題はnullではなく、その誤用であると主張しています。 記事では、参照前のチェック、ポインターInitialiなど、非参照を防止するためのベストプラクティスの詳細

この記事では、printf内の\ nエスケープシーケンスを使用してcで新しいライン文字を作成し、関数を置く方法について説明します。 機能を詳しく説明し、出力のラインブレークに使用することを示すコード例を提供します。

この記事は、Cコンパイラの選択に関する初心者を案内しています。 GCCは、使いやすさ、幅広い可用性、広範なリソースが初心者に最適であるため、最適であると主張しています。 ただし、GCC、Clang、MSVC、およびTCCも比較して、その違いを強調しています

この記事では、現代のCプログラミングにおけるNullの継続的な重要性を強調しています。 進歩にもかかわらず、Nullは明示的なポインター管理にとって重要なままであり、有効なメモリアドレスがないことをマークすることにより、セグメンテーションの障害を防ぎます。 最高のPRAC

この記事では、初心者向けのオンラインCコンパイラをレビューし、使いやすさとデバッグ機能に焦点を当てています。 OnlineGDBとRepl.itは、ユーザーフレンドリーなインターフェイスと役立つデバッグツールのために強調表示されます。 プログラムやコンパイルなどのその他のオプション

この記事では、オンラインCプログラミングプラットフォームを比較し、デバッグツール、IDE機能、標準コンプライアンス、メモリ/実行の制限などの機能の違いを強調しています。 「最良の」プラットフォームはユーザーのニーズに依存していると主張しています。

この記事では、C IDEでの効率的なコードコピーについて説明します。 コピーはコンパイラ機能ではなくIDE機能であり、IDE選択ツールの使用、コード折りたたみ、検索/交換、テンプラなど、効率を向上させるための詳細戦略であることを強調しています。

この記事では、Cプログラムのコンパイルでの出力Windowsの欠落をトラブルシューティングします。 実行可能ファイルの実行に失敗し、プログラムエラー、誤ったコンパイラ設定、バックグラウンドプロセス、迅速なプログラム終了などの原因を調べます。ソリューションにはchが含まれます
