c++強制タイプ変換(まとめ)

7524 ワード

タイプ変換とは?  
タイプ変換とは、1つの変数のタイプを別のタイプに変更することによって、その変数の表現を変更することを意味する.単純なオブジェクトを別のオブジェクトに変換するには、従来のタイプ変換オペレータを使用します.
CとC++のタイプ変換
C中:
(T)element    T(element)

c++中:
reinterpret_cast<T*> (expression) dynamic_cast<T*>     (expression) static_cast<T*>      (expression) const_cast<T*>       (expression)

 
C++の4つの強制転換形式はそれぞれ特定の目的に適している:・dynamic_castは、主に「安全なダウンシフト(safe downcasting)」を実行するために使用されます.つまり、オブジェクトが継承システムの特定のタイプであるかどうかを決定するために使用されます.これは、古いスタイルの構文で実行できない唯一の強制的なシフトであり、重大な実行時の代価がある唯一の強制的なシフトでもあります.・static_castは、暗黙的な変換を強制するために使用できます.(たとえば、non-constオブジェクトがconstオブジェクト、intがdoubleに変換されるなど)は、このような変換の逆変換(void*ポインタがタイプポインタ、ベースクラスポインタが派生クラスポインタに変換されるなど)にも使用できますが、1つのconstオブジェクトをnon-constオブジェクトに変換することはできません.(const_castのみ可能)C-styleの変換に最も近い.・const_castは一般的にオブジェクトの定数性を強制的に除去するために用いられる.それが唯一できるC++スタイルの強制的な転換である.・reinterpret_castは特に下位層の強制的な転換に用いられ、依存を実現する(implementation-dependent)(すなわち、移植不可)の結果、例えば、ポインタを整数に変換するという強制的な変換は、最下位コード以外では極めて珍しいはずです.
 
通俗的な解釈:
dynamic_cast
通常、ベースクラスと派生クラス間の変換で使用されます.
static_cast
一般的な変換は、どれを使うべきか分からない場合は、これを使います.
const_cast
主にconstとvolatileへの変換
reinterpret_cast
文字ポインタが整形数に変換されるなど、関連付けのない変換を行うために使用されます.
 
具体的な分析:
1)static_Cast(a)コンパイラのコンパイル期間処理
  • は、アドレスaをタイプTに変換し、Tおよびaは、ポインタ、参照、算術タイプ、または列挙タイプでなければならない.
  • 式static_cast(a)、aの値はテンプレートで指定したタイプTに変換されます.
  • ランタイム変換中は、タイプチェックを行わずに変換のセキュリティを確保します.
  •   static_castは、組み込まれたデータ型間で相互に変換でき、クラスに対しては関連するポインタ型間でのみ変換できます.継承系ではポインタを変換、変換することができるが、継承系以外のタイプ
  • に変換することはできない.
    class A { ... };
    class B { ... };
    class D : public B { ... };
    void f(B* pb, D* pd)
    {
        D* pd2 = static_cast<D*>(pb);        //    , pb    B   
        B* pb2 = static_cast<B*>(pd);        //    
        A* pa2 = static_cast<A*>(pb);        //  A B      
        ...
    }

    2)dynamic_cast(a)は運転期間中、この変換が可能かどうかをチェックします
  • はクラス階層のアップグレードを完了します.Tは、ポインタ、参照、またはタイプのないポインタでなければなりません.aポインタまたは参照を決定する式でなければなりません.
  •   dynamic_castはポインタまたはリファレンスにのみ適用でき、内蔵データ型
  • はサポートされていません.
  • 式dynamic_cast(a)a値をタイプTのオブジェクトポインタに変換します.タイプTがaのベースタイプでない場合、この操作は空のポインタを返します.
  • staticだけでなくcastのように、変換前後の2つのポインタが同じ継承ツリーに属しているかどうかを確認し、ポインタによって参照されるオブジェクトの実際のタイプを確認し、変換が可能かどうかを決定します.
  • が可能であれば、新しいポインタを返し、マルチ継承を処理するために必要なオフセット量さえ計算します.この2つのポインタ間を変換できない場合、変換は失敗し、空のポインタ(NULL)が返されます.
  • 明らかにdynamic_castは正常に動作し、コンパイラにランタイムタイプ情報(RTTI)をサポートさせる必要があります.
  • class Base { virtual dummy() {} };
    class Derived : public Base {};
    
    Base* b1 = new Derived;
    Base* b2 = new Base;
    
    Derived* d1 = dynamic_cast<Derived *>(b1);          // succeeds
    Derived* d2 = dynamic_cast<Derived *>(b2);          // fails: returns 'NULL'

     
    3)const_Cast(a)コンパイラのコンパイル期間処理
  • は、constまたは不安定なアドレス数を除いて、Tおよびaが同じタイプである必要があるタイプの定数を除去する.
  • 式const_cast(a)は、クラスから次の属性を除去するために使用されます:const、volatile、および_unaligned.
  • 自分が定義したconstのタイプについては、const性を外しても、この内容を操作するときは気をつけてください.rしかw操作できません.そうしないと、
  • がエラーになります.
  •       const_cast操作は異なる種類間で変換できません.逆に、1つの作用する式を定数に変換するだけです.本来constタイプではないデータをconstタイプに変換したり、constプロパティを削除したりすることができます.
  • class A { ... };
    void f()
    {
        const A *pa = new A;//const  
        A *pb;// const  
        //pb = pa; //      ,   const        const  
        pb = const_cast<A*>(pa); //   OK 
        ...
    }
    
    const char* p = "123"; 
    char* c = const_cast<char*>(p); 
    c[0] = 1;   //          const ,                  。

    4)reinterpret_Cast(a)コンパイラのコンパイル期間処理
  • 任意のポインタは、他のタイプのポインタに変換することができ、Tは、ポインタ、参照、算術タイプ、関数を指すポインタ、またはクラスメンバーを指すポインタでなければならない.
  • 式reinterpret_cast(a)は、char*からint*、またはOne_class*からUnrelated_へclass*などこのような変換は、安全ではない可能性があります.
  • class A { ... };
    class B { ... };
    void f()
    {
        A* pa = new A;
        void* pv = reinterpret_cast<A*>(pa);
        // pv           B   ,        
        ...
    }

    本文は大神のブログから削除して減らして総括して~~自分に1つの記録をします
    参照:http://blog.csdn.net/geeeeeeee/article/details/3427920
         http://www.cnblogs.com/CBDoctor/archive/2011/12/06/2277918.html