メソッド: 1. static_cast、非ポリモーフィック型の変換に使用; 2. reinterpret_cast、別の無関係な型に変換; 3. const_cast、変数の const 属性を削除して割り当て、4.dynamic_cast 、クラス継承階層間のポインターまたは参照の変換に使用されます。
このチュートリアルの動作環境: Windows 7 システム、C 17 バージョン、Dell G3 コンピューター。
C C での型変換を標準化し、型変換の可視性を高めるために、4 つの強制型変換演算子が導入されました: static_cast、reinterpret_cast、const_cast、dynamic_cast
これらは本質的にはテンプレート クラスです。
以下は別途紹介します:
1.static_cast
非ポリモーフィック型変換 (静的変換) に使用されます。 C, の暗黙的な型変換に対応しますが、整数と整数ポインターの間の変換など、無関係な 2 つの型の変換には使用できません (どちらも 4 バイトですが、一方はデータを表し、もう 1 つはアドレスを表し、型は無関係なので変換できません。
この変換は C スタイルの型変換と同様にコンパイル時に完了しますが、次の点に注意してください。派生関係のない 2 つのクラス型の間では変換できません。const、volatile、__unalignedなど、元の型の型修飾子は削除できません
オブジェクトの変換時に動的な型チェックがないため、基本クラス オブジェクトを派生クラス オブジェクトに変換するときにセキュリティ リスクが発生します
void Test() { //C中的方式 int i = 10; double d1 = i;//隐式类型转换 //int *p = i;//无法隐式类型转换,只能强制类型转换 int *p = (int*)i; //C++中的方式 double d2 = static_cast<double>(i); //相当于创建一个static_cast<double>类型的匿名对象赋值给d2 int* p2 = static_cast<int*>(i);//无法转换,会报错 }2.reinterpret_cast
reinterpret の意味は、ある型を別の無関係な型に変換できる再解釈することです。
C の強制型変換に対応し、暗黙的な変換を実行できない状況に対処します void Test()
{
int i = 10;
int* p2 = reinterpret_cast<int*>(i);
}
強制型変換は、一部の問題に激しく対処する場合があります
例:
パラメータのある関数の場合、パラメータを渡さずに関数を呼び出すにはどうすればよいですか?
void Fun(int s) { cout << s << endl; } typedef void(*FUNC)(); void Test() { FUNC pf = reinterpret_cast<FUNC>(Fun); pf(); }
C でのキャストも処理できます。
この BUG メソッドを使用して関数ポインタを変換しますが、そのようなコードは移植性がなく、不確実な結果を生成する場合があるため、このように使用することはお勧めできません
ここにあるように s の出力値はランダムな値です。ユーザーは外部パラメータを渡しませんが、関数は呼び出されたときに仮パラメータを作成します。仮パラメータは初期化されておらず、当然ランダムな値です
3.const_castその機能は、再割り当てを容易にするために変数の const 属性を削除することです
# #この変換はコンパイル時に完了し、const 修飾子と volatile 修飾子を削除するために使用されます。変換できるのはポインターまたは参照のみです。
主に「安全な下向きキャスト」に使用され、クラス継承階層間のポインターまたは参照の変換に使用されます。これは主に、「安全なダウンキャスト」を実行するために使用されます。つまり、基本クラス オブジェクトのポインターまたは参照を、同じ継承レベルの他のポインターまたは参照に変換します。
「最初の変換」(つまり、派生クラスのポインターまたは参照型が基本クラスの型に変換される) に関しては、それ自体は安全です。変換には、dynamic_cast を使用できますが、これは、必要ありませんが、dynamic_cast を使用するとオーバーヘッドが発生するため、通常の変換ですでに目的を達成できます。
void Test3() { const int i = 10; int *p = const_cast<int*>(&i); *p = 20; cout << i << endl; cout << *p << endl; }
推奨チュートリアル: "C#"
以上がC++ の型を変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。