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

C++ の型を変換する方法

醉折花枝作酒筹
醉折花枝作酒筹オリジナル
2021-06-28 14:54:502679ブラウズ

メソッド: 1. static_cast、非ポリモーフィック型の変換に使用; 2. reinterpret_cast、別の無関係な型に変換; 3. const_cast、変数の const 属性を削除して割り当て、4.dynamic_cast 、クラス継承階層間のポインターまたは参照の変換に使用されます。

C++ の型を変換する方法

このチュートリアルの動作環境: Windows 7 システム、C 17 バージョン、Dell G3 コンピューター。

C++ の型を変換する方法

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);//无法转换,会报错
}

C++ の型を変換する方法

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 の出力値はランダムな値です。ユーザーは外部パラメータを渡しませんが、関数は呼び出されたときに仮パラメータを作成します。仮パラメータは初期化されておらず、当然ランダムな値です

C++ の型を変換する方法

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

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