cとc++の強制タイプ変換
5691 ワード
c言語のタイプ変換は1つしかないことを知っています.
TYPE b = (TYPE)a;
c++では、異なる役割の変換タイプに従って3つの表示タイプ変換シンボルstatic_に細分化されます.cast, const_cast, reinterpret_cast、このような表示変換は、より豊富な意味と機能を提供し、より良いタイプの検査メカニズムを提供し、コードのメンテナンスを便利にすることができます.
1.static_castは、主に、cの基本データ型char、int、doubleなどの相関タイプ間の変換、およびベースクラスとサブクラス間の変換(dynamic_castセキュリティなし)に使用され、バイト変換がある可能性があり、int*やdouble*などの相関タイプを変換することはできません. void*と他のタイプのポインタとの間の変換
2.reinterpret_cast変換のタイプtypeはポインタまたは参照である必要があり、変換後のタイプに従ってバイトを再解釈するだけで、バイト変換 はしない.ポインタ以外の変数をポインタに変換する場合、変数のサイズはポインタのサイズと等しくなければなりません. 移植性差
3.const_cast
ポインタまたは参照のconstまたはvolatileプロパティの除去
まとめ:cに対応する3つの強制タイプ変換記号はすべてコンパイル時に決定され、RTTIのdynamic_castはcとは関係なく、後で専門的に紹介します.
TYPE b = (TYPE)a;
c++では、異なる役割の変換タイプに従って3つの表示タイプ変換シンボルstatic_に細分化されます.cast, const_cast, reinterpret_cast、このような表示変換は、より豊富な意味と機能を提供し、より良いタイプの検査メカニズムを提供し、コードのメンテナンスを便利にすることができます.
1.static_cast
double bv = 100.0
int i = (int)bv; //c style, 0x64
int iv2 = static_cast<int>(bv); //0x64
int iv2 = reinterpret_cast<int>(bv); //error,
double bv = 100.0;
double *pbv = &bv;
int *iv1 = (int*)pbv; //c style, right
int *iv2 = static_cast<int*>(pbv); //error: invalid static_cast from type `double*' to type `int*'
int *iv2 = reinterpret_cast<int*>(pbv); //right,
void *piv1 = (void*)pbv;
void *piv2 = static_cast<void*>(pbv);
int *piv3 = static_cast<int*>(piv2); //right
2.reinterpret_cast
int lv = 100;
long long llv =100;
int *piv1 = (int*)lv; //c style, do’not check size
int *piv2 = reinterpret_cast<int*>(lv); //lv is treated as pointer
piv2 = reinterpret_cast<int*>(llv); // warning, different size
3.const_cast
ポインタまたは参照のconstまたはvolatileプロパティの除去
//c style
const char const_char = 'a';
char *pch = &const_char; //error: invalid conversion from `const char*' to `char*'
char *pch = (char*)&const_char; //right
*pch = 'c';
//c++style
const char const_char = 'a';
char chv = const_cast<char>(const_char); //error, invalid use of const_cast with type `char', which is not a pointer, reference, nor a pointer-to-data-member type
const char *pch = &const_char;
char *chv = const_cast<char*>(&const_char);//right
*chv=’c’;
まとめ:cに対応する3つの強制タイプ変換記号はすべてコンパイル時に決定され、RTTIのdynamic_castはcとは関係なく、後で専門的に紹介します.