C++の4種類の変換方式
2162 ワード
1.4種類の変換方式
static_cast:基本タイプと継承関係の変換、変数の内部表現の変更(最も一般的)
reinsterpret_cast:ポインタを別のポインタとして解釈し、ポインタが指すデータ(ポインタ)を変更しない
const_キャスト:キャンセル
dynamic_cast:クラスオブジェクトのポインタまたは参照を継承する変換(実行時)
2. static_cast
基本タイプと継承関係の変換に使用し、変数の内部表現を変更します.
'static_cast'は任意の暗黙的変換と逆変換動作を実行することを許可する
逆変換アクションぎゃくへんかんあくしょん:変数の内部表示を変更へんこうへんすうのないぶひょうじをへんこうする
3. reinsterpret_cast
ポインタを別のポインタとして解釈し、ポインタが指すデータを変更しません.
ポインタにのみ作用します.
このオペレータは、非相関タイプ間で変換できます.操作結果は,1つのポインタから別のポインタへの値のバイナリコピーにすぎない.タイプ間で指す内容は、タイプのチェックや変換は行われません.
4. const_cast
定数属性の除去または追加
5. dynamic_cast
クラスオブジェクトのポインタまたは参照の変換を継承します.
他の3つとは異なり,この変換は実行時に変換解析され,他の3つはコンパイル時に行われる.
変換に失敗したかどうかはnullで検出できるかどうか、参照変換に失敗した場合はbad_を投げ出すcast異常.
継承関係がない、または虚関数がないオブジェクトポインタを変換する場合は、基本タイプポインタ変換、ベースクラスポインタを派生クラスポインタに変換します.
コンパイルできません.
reinterpret_cast(expression)
dynamic_cast(expression)
static_cast(expression)
const_cast(expression)
static_cast:基本タイプと継承関係の変換、変数の内部表現の変更(最も一般的)
reinsterpret_cast:ポインタを別のポインタとして解釈し、ポインタが指すデータ(ポインタ)を変更しない
const_キャスト:キャンセル
dynamic_cast:クラスオブジェクトのポインタまたは参照を継承する変換(実行時)
2. static_cast
基本タイプと継承関係の変換に使用し、変数の内部表現を変更します.
'static_cast'は任意の暗黙的変換と逆変換動作を実行することを許可する
逆変換アクションぎゃくへんかんあくしょん:変数の内部表示を変更へんこうへんすうのないぶひょうじをへんこうする
double d = 3.14159265;
int i = static_cast(d);
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = static_cast(a);
3. reinsterpret_cast
ポインタを別のポインタとして解釈し、ポインタが指すデータを変更しません.
ポインタにのみ作用します.
このオペレータは、非相関タイプ間で変換できます.操作結果は,1つのポインタから別のポインタへの値のバイナリコピーにすぎない.タイプ間で指す内容は、タイプのチェックや変換は行われません.
//
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast(pd); // int *pi = (int*)pd;
//
class A{};
class B{};
A* pa = new A;
B* pb = reinterpret_cast(pa); // B* pb = (B*)pa;
//
long l = reinterpret_cast(pi); // long l = (long)pi;
4. const_cast
定数属性の除去または追加
const int* pci = 0;
int* pk = const_cast(pci); // int* pk = (int*)pci;
const A* pca = new A;
A* pa = const_cast(pca); //A*pa=(A*)pcaに する。
5. dynamic_cast
クラスオブジェクトのポインタまたは参照の変換を継承します.
他の3つとは異なり,この変換は実行時に変換解析され,他の3つはコンパイル時に行われる.
変換に失敗したかどうかはnullで検出できるかどうか、参照変換に失敗した場合はbad_を投げ出すcast異常.
class Base{};
class Derived : public Base{};
//
Derived *pd = new Derived;
Base *pb = dynamic_cast (pd);
if (!pb)
cout << " " << endl;
// ,
class A(virtual ~A();) //
class B{}:
A* pa = new A;
B* pb = dynamic_cast(pa);
継承関係がない、または虚関数がないオブジェクトポインタを変換する場合は、基本タイプポインタ変換、ベースクラスポインタを派生クラスポインタに変換します.
コンパイルできません.