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*と他のタイプのポインタとの間の変換
  • 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
  • 変換のタイプtypeはポインタまたは参照である必要があり、変換後のタイプに従ってバイトを再解釈するだけで、バイト変換
  • はしない.
  • ポインタ以外の変数をポインタに変換する場合、変数のサイズはポインタのサイズと等しくなければなりません.
  • 移植性差
  • 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とは関係なく、後で専門的に紹介します.