C++的四種轉換(const_cast、static_cast、dynamic_cast、reinterpreter_cast)


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));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM