解析C++における4種類の強制型変換の違いの詳細
3101 ワード
C++の4種類の強制タイプ変換なので、C++はタイプ安全ではありません.それぞれ:static_cast , dynamic_cast , const_cast , reinterpret_cast
なぜCスタイルの強制変換を使うのか、欲しいものを気持ちに合うタイプに変えることができます.では、なぜ新しいC++タイプの強制変換が必要なのでしょうか.新しいタイプの強制変換は、さまざまな種類の強制変換を制御できるように、強制変換プロセスをよりよく制御することができます.C++中スタイルはstatic_cast(content).C++スタイルの強制変換の他の利点は、何をするのかをより明確に示すことです.プログラマーはこのようなコードを一目見れば、強制変換の目的をすぐに知ることができます.
4つの変換の違い:
static_cast:
C++に組み込まれた基本データ型間の相互変換を実現できます.クラスに触れるとstatic_castは相互に関連するタイプでのみ相互変換でき,必ずしも虚関数を含まない.
const_cast:
const_cast操作は異なる種類間で変換できません.逆に、1つの作用する式を定数に変換するだけです.本来constタイプではないデータをconstタイプに変換したり、constプロパティを削除したりすることができます.
reinterpret_cast:
Cスタイルの強制転換と同じ能力を持っている.内蔵されたデータ型を他のデータ型に変換したり、ポインタ型を他のタイプに変換したりすることができます.組み込みのデータ型をポインタに変換することもでき、タイプのセキュリティや定数を考慮する必要はありません.やむを得ず絶対に使わない.
dynamic_cast:(1)他の3つはコンパイル時に完了しましたdynamic_castは実行時に処理され、実行時にタイプチェックが行われます.(2)組み込みの基本データ型の強制変換には使用できません.(3)dynamic_cast変換が成功するとクラスへのポインタや参照が返され、変換に失敗するとNULLが返されます.(4)dynamic_の使用castが変換する場合、ベースクラスには必ず虚関数があります.そうしないと、コンパイルは通過しません.Bに虚関数がある原因を検出する必要がある:クラスに虚関数が存在すると,ベースクラスポインタや参照を派生クラスオブジェクトに指向させたい場合があることを示し,このとき変換することに意味がある.これは、ランタイムタイプチェックにはランタイムタイプ情報が必要であり、この情報はクラスの虚関数テーブル(虚関数テーブルの概念については)に格納され、虚関数を定義したクラスのみが虚関数テーブルを持つためである.(5)クラスの変換時にクラス階層間で上り変換を行う場合dynamic_キャストとstatic_キャストの効果は同じです.下り変換時にdynamic_castにはstatic_よりもタイプチェック機能があります.castの方が安全です.アップコンバージョンとは、親ポインタが子ポインタに変換されるサブクラスオブジェクトへのダウンコンバージョンです.変換が成功したかどうかは、変換するポインタが指すオブジェクトの実際のタイプが変換後のオブジェクトのタイプと同じでなければ、変換に失敗します.参考例:
なぜCスタイルの強制変換を使うのか、欲しいものを気持ちに合うタイプに変えることができます.では、なぜ新しいC++タイプの強制変換が必要なのでしょうか.新しいタイプの強制変換は、さまざまな種類の強制変換を制御できるように、強制変換プロセスをよりよく制御することができます.C++中スタイルはstatic_cast
4つの変換の違い:
static_cast:
C++に組み込まれた基本データ型間の相互変換を実現できます.クラスに触れるとstatic_castは相互に関連するタイプでのみ相互変換でき,必ずしも虚関数を含まない.
int c=static_cast<int>(7.987); //
class A //
{};
class B:public A
{};
class C
{};
int main()
{
A* a=new A;
B* b;
C* c;
b=static_cast<B>(a); // , B A
c=static_cast<B>(a); // , C A
return 1;
}
const_cast:
const_cast操作は異なる種類間で変換できません.逆に、1つの作用する式を定数に変換するだけです.本来constタイプではないデータをconstタイプに変換したり、constプロパティを削除したりすることができます.
reinterpret_cast:
Cスタイルの強制転換と同じ能力を持っている.内蔵されたデータ型を他のデータ型に変換したり、ポインタ型を他のタイプに変換したりすることができます.組み込みのデータ型をポインタに変換することもでき、タイプのセキュリティや定数を考慮する必要はありません.やむを得ず絶対に使わない.
dynamic_cast:(1)他の3つはコンパイル時に完了しましたdynamic_castは実行時に処理され、実行時にタイプチェックが行われます.(2)組み込みの基本データ型の強制変換には使用できません.(3)dynamic_cast変換が成功するとクラスへのポインタや参照が返され、変換に失敗するとNULLが返されます.(4)dynamic_の使用castが変換する場合、ベースクラスには必ず虚関数があります.そうしないと、コンパイルは通過しません.Bに虚関数がある原因を検出する必要がある:クラスに虚関数が存在すると,ベースクラスポインタや参照を派生クラスオブジェクトに指向させたい場合があることを示し,このとき変換することに意味がある.これは、ランタイムタイプチェックにはランタイムタイプ情報が必要であり、この情報はクラスの虚関数テーブル(虚関数テーブルの概念については
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout<<"hello"<<endl;
};
};
class B:public A
{
public:
void f()
{
cout<<"hello2"<<endl;
};
};
class C
{
void pp()
{
return;
}
};
int fun()
{
return 1;
}
int main()
{
A* a1=new B;//a1 A B
A* a2=new A;//a2 A A
B* b;
C* c;
b=dynamic_cast<B*>(a1);// not null, ,a1 B , B 。
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
b=dynamic_cast<B*>(a2);// null,
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
c=dynamic_cast<C*>(a);// null,
if(c==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
delete(a);
return 0;
}