C++中,四個與類型轉換相關的關鍵字:static_cast、const_cast、reinterpret_cast、dynamic_cast。
static_cast
特點:靜態轉換,在編譯處理期間。
應用場合:主要用於C++中內置的基本數據類型之間的轉換,但是沒有運行時類型的檢測來保證轉換的安全性。
- 用於基類和子類之間的指針或引用之間的轉換,這種轉換把子類的指針或引用轉換為基類表示是安全的;進行下行轉換,把積累的指針或引用轉換為子類表示時,由於沒有進行動態類型檢測,所以是不安全的。
- 把void類型的指針轉換成目標類型的指針(不安全)。
- 不能用於兩個不相關的類型轉換。
- 不能把const對象轉換成非const對象。
const_cast
特點:去常轉換,編譯時執行。
應用場合:const_cast操作不能在不同的種類間轉換。相反,它僅僅把它作用的表達式轉換成常量。它可以使一個本來不是const類型的數據轉換成const類型的,或者把const屬性去掉。
reinterpret_cast
特點: 重解釋類型轉換
應用場合:它有着和c風格強制類型轉換同樣的功能;它可以轉化任何的內置數據類型為其他的類型,同時它也可以把任何類型的指針轉化為其他的類型;它的機理是對二進制進行重新的解釋,不會改變原來的格式。
dynamic_cast < type-id > ( expression )
該運算符將expression轉換成type_id類型的對象。type_id必須是類的指針,類的引用或者空類型的指針。
a、如果type_id是一個指針類型,那么expression也必須是一個指針類型,如果type_id是一個引用類型,那么expression也必須是一個引用類型。
b、如果type_id是一個空類型的指針,在運行的時候,就會檢測expression的實際類型,結果是一個由expression決定的指針類型。
c、如果type_id不是空類型的指針,在運行的時候指向expression對象的指針能否可以轉換成type_id類型的指針。
d、在運行的時候決定真正的類型,如果向下轉換是安全的,就返回一個轉換后的指針,若不安全,則返回一個空指針。
d、在運行的時候決定真正的類型,如果向下轉換是安全的,就返回一個轉換后的指針,若不安全,則返回一個空指針。
e、主要用於上下行之間的轉換,也可以用於類之間的交叉轉換。上行轉換時和static_cast效果一樣,下行轉換時,具有檢測功能,比static_cast更安全。