reinterpret_cast使用説明

3298 ワード

reinterpret_cast <new_type> (expression)
reinterpret_cast        !             ,                     !                     ,           !

              ,       ,       int      ,        ,          !

例を見てみましょう
int *pi;  
char *pc = reinterpret_cast<char*>(pi);  
OK,         reinterpret_cast     ,       ,            ,pc           int ,  char~

reinterpret_の場合cast演算子は慎重に使用し、IBM C++を参照してください.
  • A pointer to any integral type large enough to hold it(ポインタが十分大きい整数タイプに転向する)
  • A value of integral or enumeration type to a pointer(整形またはenum列挙タイプからポインタに変換)
  • A pointer to a function to a pointer to a function of a different type(関数を指すポインタから別の異なるタイプの関数を指すポインタへ)
  • A pointer to an object to a pointer to an object of a different type(オブジェクトを指すポインタから別の異なるタイプのオブジェクトを指すポインタへ)
  • A pointer to a member to a pointer to a member of a different class or type,if the types of the members are both function types or object types(メンバーを指すポインタからクラスメンバーを指すポインタへ!またはタイプ、タイプのメンバーと関数が関数タイプまたはオブジェクトタイプである場合)
  • これらはIBM C++がお勧めする使い方です!
     reinterpret_castは完全に異なるタイプの意味にマッピングするためで、このキーワードは私たちがタイプを元のタイプにマッピングする必要があるときに使用します.我々がマッピングしたタイプは,すべてのマッピングの中で最も危険であることを明らかにするためだけであり,他の目的を明らかにするためである.(この言葉はC++プログラミング思想の原話です)
    皆さんが使うときはくれぐれも覚えておいてください.むやみに使わないでください.誤った使用はプログラムの不安全を招きやすい!Misuse of the reinterpret_cast operator can easily be unsafe. これはMSDNの原話です!
    もちろんreinterpret_cast対const,volatile,or_unalignedも役に立たない!
    MSDNの上で1つの実際的な用途をあげました:ハッシュ関数の補助
    // expre_reinterpret_cast_Operator.cpp 
    // compile with: /EHsc 
    #include <iostream> 
    
    // Returns a hash code based on an address 
    unsigned short Hash( void *p ) {  
       unsigned int val = reinterpret_cast<unsigned int>( p );  
       return ( unsigned short )( val ^ (val >> 16));  
    }  
    
    using namespace std;  
    int main() {  
       int a[20];  
       for ( int i = 0; i < 20; i++ )  
          cout << Hash( a + i ) << endl;  
    }  

    強制タイプ変換については、それぞれの用途がありますが、頻繁に使用しないでください.使用するたびに、同じ目的を達成できる他の方法があるかどうかを試してみましょう.使用する必要がある場合は、強制変換の役割ドメインを制限し、仮定に関連するタイプを記録して、エラーの発生を減らすことができます.