在C++中,除了支持C語言中的隱式類型轉(zhuǎn)換外,同時(shí)引入了四種顯示的類型轉(zhuǎn)換函數(shù),以確切的標(biāo)識(shí)出正在進(jìn)行的轉(zhuǎn)換類型。
函數(shù)原型為(均為模板函數(shù)):
static_cast<new_type>(expression)
const_cast<new_type>(expression)
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
前三個(gè)是在編譯時(shí)期進(jìn)行類型轉(zhuǎn)換的,而最后一個(gè)則是在運(yùn)行時(shí)期進(jìn)行轉(zhuǎn)換的,即dynamic_cast函數(shù)需要RTTI的支持,如果是VC下,需要手動(dòng)打開RTTI支持選項(xiàng)。
static_cast主要完成相關(guān)類型之間的轉(zhuǎn)換,比如整型到枚舉、整型到浮點(diǎn)等。但static_cast不能轉(zhuǎn)換掉expression的const、volitale、或者_(dá)_unaligned屬性
const_cast一般用于強(qiáng)制消除對(duì)象的常量性,它是唯一能做到這一點(diǎn)的 C++ 風(fēng)格的強(qiáng)制轉(zhuǎn)型,但需注意的是只能轉(zhuǎn)換指針或引用類型,而不能轉(zhuǎn)換普通常量類型。
如:
const int a = 1;
int b = const_cast <int>(a);
是錯(cuò)誤的。
reinterpret_cast用于字節(jié)數(shù)相同的類型之間的轉(zhuǎn)換,常用的就是整型和指針之間、函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換。操作符僅僅重新解釋了對(duì)象的比特模型而沒有進(jìn)行二進(jìn)制轉(zhuǎn)換,需謹(jǐn)慎使用,一般只在把類型映射回原有類型時(shí)使用。
dynamic_cast主要用于類層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換。
在類層次間進(jìn)行上行轉(zhuǎn)換時(shí),dynamic_cast和static_cast的效果是一樣的;
在進(jìn)行下行轉(zhuǎn)換時(shí),dynamic_cast具有類型檢查的功能,比static_cast更安全。
你能用dynamic_cast把指向基類的指針或引用轉(zhuǎn)換成指向其派生類或其兄弟類的指針或引用,而且你能知道轉(zhuǎn)換是否成功。失敗的轉(zhuǎn)換將返回空指針(當(dāng)對(duì)指針進(jìn)行類型轉(zhuǎn)換時(shí))或者拋出異常(當(dāng)對(duì)引用進(jìn)行類型轉(zhuǎn)換時(shí))。