C++型変換解析

2701 ワード

dynamic_cast:       
static_cast:       
reinterpret_cast:         
const_cast:       

1. dynamic_cast   
  :               
  :              
2. static_cast   
  :      
  :                
3. reinterpret_cast   
  :      ,             
  :        ,                        ,                 
4. const_cast   
  :       const volatile  


//TODO: dynamic_cast static_cast  
    dynamic_cast<type-id>(expression)
    (1) type-id       、      void*
    (2)       (downcast)    ,     ;      (downcast)   ,   ,     
    (3)          (upcast) ,dynamic_cast static_cast       ;       (downcast) ,dynamic_cast        , static_cast   
    (4) dynamic_cast       ,          ,      (err:source type is not polymorphic); static_cast    ,static_cast      
    (5) dynamic_cast              ,               
    (6) dynamic_cast      ; static_cast     
    
    static_cast<type-id>(expression)
    (1)        /     ;      (upcast-     /         )     ,      (downcast-    /          )      
    (2)              , int   char、int   enum,         
    (3)                
    (4)             void  
    // static_cast     expression const、volatile、  __unaligned  
    (5) C++  static_cast        ,    C        ,           
    
    reinterpret_cast<type-id>(expression)
    (1) type-id       /  /    /    /    ;              ,               
    (2) reinterpret_cast   const_cast    const   
    
    
    const_cast<type_id> (expression)
    (1)               ,           ;
    (2)               ,           ;
    (3) const_cast         。 const char *p  。
    
    
    
//Sample:
class A {
public:
        int m_memberA;
        virtual void foo() {// virtual for dynamic_cast
                printf("foo
");         } }; class B : public A { public:         int m_memberB; }; class D : public A { public: }; void func(A* pa) {         B* pb1 = static_cast<B*>(pa);         B* pb2 = dynamic_cast<B*>(pa); } int main(int argc, char* argv[]) {         B* pb = new B();         func(pb);         //D* pd0 = static_cast<D*>(pb); //compile error         D* pd1 = dynamic_cast<D*>(pb);         int i;         float f = 16.1;         i = static_cast<int>(f);         return 0; } //TODO: const_cast class B { public:     B() { } public:     int m_iNum; }; void foo() {     const B b1;     //b1.m_iNum = 100; //compile error     //  ,     B *b2 = const_cast<B*>(&b1);     //  , b2 b3 , b1     B &b3 = const_cast<B&>(b1);     b2->m_iNum = 200;    //fine     b3.m_iNum = 300;    //fine } int main( int argc, char * argv[] ) {     foo();     return 0; }