C++xxx_cast変換コードの実例解析を実現する
1.1 static_cast
static.castは一方向に暗黙的な変換を実現し、他の方向に静的変換を実現することができる。シングル隠とダブル隠の両方の場合に適しています。
二重に隠す
ダブルブランクとは、両方とも直接暗黙的に変換でき、一般的なタイプのデータ変換(int、float、double、longなどのデータタイプ間の変換)に適用されます。
単独で隠れる
一つの方向のみを暗黙的に変換することができます。他の方向では静的な変換しかできません。void*とポインタの間の変換のように、任意の種類のポインタがvoid*に変換されますが、void*は任意の種類のポインタに変換されませんので、void*を任意の種類のポインタに変換する場合は、静的な変換を呼び出す必要があります。
reinterpret_cast「通常はオペランドのビットパターンについて、より低い層の再解釈を提供する」->つまり、データをバイナリ形式で再解釈し、両方の方向で暗黙的なタイプに変換できない場合、再タイプ変換が必要である。二重非表示を実現することができます。
Constcastは、非constオブジェクトの参照またはポインタの定数を除去するために使用されてもよい。これは、const変数を非const変数に変換することができる。ポインタおよび参照を除去するためのconst、const_に使用することができる。castはconstに対する語義補足である。目的の種類は、参照またはポインタだけです。
非constオブジェクト-->const参照またはポインタ-->脱const-->非constオブジェクトを変更する
static.castは一方向に暗黙的な変換を実現し、他の方向に静的変換を実現することができる。シングル隠とダブル隠の両方の場合に適しています。
二重に隠す
ダブルブランクとは、両方とも直接暗黙的に変換でき、一般的なタイプのデータ変換(int、float、double、longなどのデータタイプ間の変換)に適用されます。
単独で隠れる
一つの方向のみを暗黙的に変換することができます。他の方向では静的な変換しかできません。void*とポインタの間の変換のように、任意の種類のポインタがvoid*に変換されますが、void*は任意の種類のポインタに変換されませんので、void*を任意の種類のポインタに変換する場合は、静的な変換を呼び出す必要があります。
// static_cast, , ,
// , , ,
int a = 4;
double b = 3.2;
a = b;
b = a;
cout << a << endl;
cout << b << endl;
a = static_cast<int> (b);
b = static_cast<double> (a);
// , ,
// void*, void*
void* p = &b;
int* q = &a;
p = q;
q = static_cast<int*>(p);
1.2 reinterpret_castreinterpret_cast「通常はオペランドのビットパターンについて、より低い層の再解釈を提供する」->つまり、データをバイナリ形式で再解釈し、両方の方向で暗黙的なタイプに変換できない場合、再タイプ変換が必要である。二重非表示を実現することができます。
//
int *m=&a;
int n=4;
m = reinterpret_cast<int*>(n);
n = reinterpret_cast<int>(m);
1.3 const_castConstcastは、非constオブジェクトの参照またはポインタの定数を除去するために使用されてもよい。これは、const変数を非const変数に変換することができる。ポインタおよび参照を除去するためのconst、const_に使用することができる。castはconstに対する語義補足である。目的の種類は、参照またはポインタだけです。
非constオブジェクト-->const参照またはポインタ-->脱const-->非constオブジェクトを変更する
//const_cast--> const const,
/************ , const ************/
int aa;
const int& ra = aa;
aa = 100;
cout << aa << endl;
cout << ra << endl;
//ra = 200;// , ra const, ra , const
const_cast<int&> (ra) = 300;
cout << aa << endl;
cout << ra << endl;
/************ , const ************/
const int* pp = &a;
//*p = 200;// , p const , p , const
*const_cast<int*>(pp) = 500;
cout << *pp << endl;
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。