4 type cast operators in C++

摘自《高質量程序設計指南》第3版(林銳,韓永泉)263頁。

C++新增了4個類型轉換運算符,它們是:

1.       static_cast<dest_type>(src_obj),作用相當於C風格的強制轉換,但是在多重繼承的情況下,它會正確地調整指針的值(即確定dest_type類型的指針應該指向src_obj中的什麼位置),而C風格的強制轉換則不會調整;它可以遍歷繼承樹來確定src_objdest_type的關係,但是隻在編譯時進行(此所謂靜態);如果使用它來做downcast操作(即把一個base class的指針轉換成一個derived class的指針,當然那個base class的指針最好原是指向一個derived class的對象,這個過程應該調用dynamic_cast來完成),則會存在隱患。

2.       const_cast<dest_type>(src_obj),用於去除一個對象的const/volatile屬性。

3.       reinterpret_cast<dest_type>(src_obj),我們可以藉助它把一個整數轉換成一個地址,或者在任何兩種類型的指針之間轉換。使用該運算符的結果很危險,請你不要輕易使用。

4.       dynamic_cast<dest_type>(src_obj),在運行時遍歷繼承樹(類層次結構)來確定src_objdest_type的關係,具體在本書第15章講述。

補充:1)C++中默認執行的轉型操作是static_cast,手工執行static_cast時需確保dest_type和src_obj間應存在一定的關係,如繼承關係等。對2種沒有任何關係的ADT進行static_cast會產生編譯錯誤,此時需用reinterpret_cast完成,但無法保證轉型後的數據有意義。2)用const_cast來去除一個對象的const屬性時,如用普通指針指向一個const對象,未必可以修改原對象的值。如果原對象是個ADT常量,則可以修改成功;若原對象爲基本數據類型的常量,則無法成功。這和不同類型的常量相異的存儲方式有關係。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章