標(biāo)準(zhǔn)c++中主要有四種強(qiáng)制轉(zhuǎn)換類型運(yùn)算符:     

const_castreinterpret_caststatic_castdynamic_cast等等。   

1)static_cast<T*>(a)   

將地址a轉(zhuǎn)換成類型T,T和a必須是指針、引用、算術(shù)類型或枚舉類型。   

表達(dá)式static_cast<T*>(a), a的值轉(zhuǎn)換為模板中指定的類型T。在運(yùn)行時轉(zhuǎn)換過程中,不進(jìn)行類型檢查來確保轉(zhuǎn)換的安全性。   

例子:   

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);        // 安全的   
    
}
 

  

2)dynamic_cast<T*>(a)   

完成類層次結(jié)構(gòu)中的提升。T必須是一個指針、引用或無類型的指針。a必須是決定一個指針或引用的表達(dá)式。   

表達(dá)式dynamic_cast<T*>(a) 將a值轉(zhuǎn)換為類型為T的對象指針。如果類型T不是a的某個基類型,該操作將返回一個空指針。   

例子:   

class A  };   

class B  };    

void f()   

{   

  A
* pa = new A;   

  B
* pb = new B;   

  
void* pv = dynamic_cast<A*>(pa);   

  
// pv 現(xiàn)在指向了一個類型為A的對象   
   

  pv 
= dynamic_cast<B*>(pb);   

  
// pv 現(xiàn)在指向了一個類型為B的對象   

}
  

 

3)const_cast<T*>(a)   

去掉類型中的常量,除了const或不穩(wěn)定的變址數(shù),T和a必須是相同的類型。   

表達(dá)式const_cast<T*>(a)被用于從一個類中去除以下這些屬性:constvolatile, 和 __unaligned。   

例子:   

class A  };   

void f()   

{   

 
const A *pa = new A;//const對象   

 A 
*pb;//非const對象   

//pb = pa; // 這里將出錯,不能將const對象指針賦值給非const對象   

 pb 
= const_cast<A*>(pa); // 現(xiàn)在OK了   

..   }
  

 

4)reinterpret_cast<T*>(a)   

任何指針都可以轉(zhuǎn)換成其它類型的指針,T必須是一個指針、引用、算術(shù)類型、指向函數(shù)的指針或指向一個類成員的指針。   

表達(dá)式reinterpret_cast<T*>(a)能夠用于諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類似這樣的轉(zhuǎn)換,因此可能是不安全的。   

例子:   

 

class A  };   

class B  };   

void f()   

{   

  A
* pa = new A;   

  
void* pv = reinterpret_cast<A*>(pa);   

  
// pv 現(xiàn)在指向了一個類型為B的對象,這可能是不安全的   

     

}
  

 
本文轉(zhuǎn)自http://www.libing.net.cn/read.php?520