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