1.?c風(fēng)格強(qiáng)制轉(zhuǎn)換
int?a=1;
char?b=(char)a;
?這種轉(zhuǎn)換適用于面向過(guò)程的沒(méi)有類的概念的c語(yǔ)言的轉(zhuǎn)換,然而這樣的轉(zhuǎn)換符也能不分青紅皂白的應(yīng)用于類和類的指針,沒(méi)有安全檢查。
2.?const_cast
用法:const_cast<type_id> (expression)
用于修改類型的const或volatile屬性,一般用于強(qiáng)制消除對(duì)象的常量性,c中不提供消除這const的機(jī)制
3.?static_cast
用法:static_cast<type_id> (expression)
該轉(zhuǎn)換和c風(fēng)格的轉(zhuǎn)換很類似,沒(méi)有運(yùn)行時(shí)類型檢查,所以無(wú)法保證轉(zhuǎn)換的安全性。主要有以下幾種用法:
(1)用于基本數(shù)據(jù)類型,或者non_const到const(反過(guò)來(lái)必須用const_cast)
(2)把空指針轉(zhuǎn)換為目標(biāo)類型的指針
(3)將任何類型的表達(dá)式轉(zhuǎn)換為void類型
(4)可以將子類類型的指針轉(zhuǎn)換為父類類型的指針(這種轉(zhuǎn)換的安全性需要開(kāi)發(fā)人員來(lái)保證)
4.?dynamic_cast
用法:dynamic_cast<type*>(expression)
他只用于對(duì)象和引用,主要用于執(zhí)行安全的向下轉(zhuǎn)型,他可以將指向子類的父類指針轉(zhuǎn)換為子類指針,但是要求父類有虛函數(shù),如果轉(zhuǎn)換為指針類型失敗則返回NULL,如果是引用類型轉(zhuǎn)換失敗則跑出bad_cast的異常
5.?reinpreter_cast
用法:reinpreter_cast<type_id> (expression)
type_id可以是指針,引用,算術(shù)類型,函數(shù)指針或者成員指針,這個(gè)操作符可以在非相關(guān)的類型之間轉(zhuǎn)換,操作只是簡(jiǎn)單的從一個(gè)指針到別的指針的值得二進(jìn)制拷貝,在類型之間指向的內(nèi)容不作任何類型的檢查和轉(zhuǎn)換。
note:關(guān)于static_cast?和 dynamic_cast的區(qū)別:
a.?static在轉(zhuǎn)換時(shí)不進(jìn)行安全性檢查,完全需要開(kāi)發(fā)者自己考慮, dynamic?在轉(zhuǎn)換的時(shí)候會(huì)進(jìn)行安全性檢查,如果是指針類型的轉(zhuǎn)換失敗返回NULL,如果是引用類型的轉(zhuǎn)換失敗,則跑出bad_cast?異常。
b.?static主要是用于值類型之間的轉(zhuǎn)換,而dynamic只能用于對(duì)象的指針和引用的cast,dynamic是向下的轉(zhuǎn)換,而且要求父類有虛函數(shù),否則會(huì)編譯出錯(cuò)。