關於static_cast dynamic_cast reinterpret_cast的使用方法和場合

pret_cast可以轉換任意一個32bit整數,包括所有的指針和整數。可以把任何整數轉成指針,也可以把任何指針轉成整數,以及把指針轉化爲任意類型的指針,威力最爲強大!但不能將非32bit的實例轉成指針。總之,只要是32bit的東東,怎麼轉都行! 
static_cast和dynamic_cast可以執行指針到指針的轉換,或實例本身到實例本身的轉換,但不能在實例和指針之間轉換。static_cast只能提供編譯時的類型安全,而dynamic_cast可以提供運行時類型安全。舉個例子: 
class a;class b:a;class c。 
上面三個類a是基類,b繼承a,c和ab沒有關係。 
有一個函數void function(a&a); 
現在有一個對象是b的實例b,一個c的實例c。 
function(static_cast<a&>(b)可以通過而function(static<a&>(c))不能通過編譯,因爲在編譯的時候編譯器已經知道c和a的類型不符,因此static_cast可以保證安全。 
下面我們騙一下編譯器,先把c轉成類型a 
b& ref_b = reinterpret_cast<b&>c; 
然後function(static_cast<a&>(ref_b))就通過了!因爲從編譯器的角度來看,在編譯時並不能知道ref_b實際上是c! 
而function(dynamic_cast<a&>(ref_b))編譯時也能過,但在運行時就失敗了,因爲dynamic_cast在運行時檢查了ref_b的實際類型,這樣怎麼也騙不過去了。 
在應用多態編程時,當我們無法確定傳過來的對象的實際類型時使用dynamic_cast,如果能保證對象的實際類型,用static_cast就可以了。至於reinterpret_cast,我很喜歡,很象c語言那樣的暴力轉換:)

dynamic_cast:動態類型轉換 
static_cast:靜態類型轉換 
reinterpret_cast:重新解釋類型轉換 
const_cast:常量類型轉換 
專業的上面很多了,我說說我自己的理解吧: 
synamic_cast一般用在父類和子類指針或應用的互相轉化; 
static_cast一般是普通數據類型(如int m=static_cast<int>(3.14)); 
reinterpret_cast很像c的一般類型轉換操作 
const_cast是把cosnt或volatile屬性去掉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章