static_cast
相當於C語言中的強制轉換:(類型)表達式或類型(表達式),用於各種隱式轉換
非const轉const、void*轉指針、int和char相互轉換
用於基類和子類之間的指針和引用轉換,非指針直接報錯
向上轉化是安全的,如果向下轉能(指針或引用)成功但是不安全,結果未知;
dynamic_cast
用於動態類型轉換。只能用於含有虛函數的類,必須用在多態體系種,用於類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對於指針返回NULL,對於引用拋異常。
在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
如果沒有virtual方法進行下行轉換(指針或引用)會直接報錯
const_cast
常量指針被轉化成非常量的指針,並且仍然指向原來的對象;
常量引用被轉換成非常量的引用,並且仍然指向原來的對象;
const_cast一般用於修改底指針。如const char *p形式。
const int a=10;
int *p=const_cast<int*>(&a); //p和a指向同一塊內存地址
*p = 100; //修改*p,但a=10,*p=100
reinterpret_cast
(重解釋轉換)幾乎什么都可以轉,比如將int轉指針,可能會出問題,盡量少用;隨意的轉換編譯都會通過,但是不安全的轉換運行時會異常
錯誤的使用reinterpret_cast很容易導致程序的不安全,只有將轉換后的類型值轉換回到其原始類型,這樣才是正確使用reinterpret_cast方式。
reinterpret_cast不能轉換掉表達式的const
可以用在將void*轉換為int類型
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}