C++中的型別強制轉換
C++ 同時提供了四種新的強制轉型形式(通常稱為新風格的或 C++ 風格的強制轉型):
const_cast(expression)
dynamic_cast(expression)
reinterpret_cast(expression)
static_cast(expression)
每一種適用於特定的目的:
·dynamic_cast 主要用於執行“安全的向下轉型(safe downcasting)”,也就是說,要確定一個物件是否是一個繼承體系中的一個特定型別。它是唯一不能用舊風格語法執行的強制轉型,也是唯一可能有重大執行時代價的強制轉型。
·static_cast 可以被用於強制隱型轉換(例如,non-const 物件轉型為 const 物件,int 轉型為 double,等等),它還可以用於很多這樣的轉換的反向轉換(例如,void* 指標轉型為有型別指標,基類指標轉型為派生類指標),但是它不能將一個 const 物件轉型為 non-const 物件(只有 const_cast 能做到),它最接近於C-style的轉換。
·const_cast 一般用於強制消除物件的常量性。它是唯一能做到這一點的 C++ 風格的強制轉型。
·reinterpret_cast 是特意用於底層的強制轉型,導致實現依賴(implementation-dependent)(就是說,不可移植)的結果,例如,將一個指標轉型為一個整數。這樣的強制轉型在底層程式碼以外應該極為罕見。
舊風格的強制轉型依然合法,但是新的形式更可取。首先,在程式碼中它們更容易識別(無論是人還是像 grep 這樣的工具都是如此),這樣就簡化了在程式碼中尋找型別系統被破壞的地方的過程。第二,更精確地指定每一個強制轉型的目的,使得編譯器診斷使用錯誤成為可能。例如,如果你試圖使用一個 const_cast 以外的新風格強制轉型來消除常量性,程式碼將無法編譯。
以下是對它們進行一些基本的比較:
1、static_cast V.S. dynamic_cast:dynamic_cast可用於繼承體系中的向下轉型,即將基類指標轉換為派生類指標,比static_cast更嚴格更安全。dynamic_cast在執行效率上比static_cast要差一些,但static_cast在更寬上範圍內可以完成對映,這種不加限制的對映伴隨著不安全性。
2、static_cast V.S. reinterpret_cast:static_cast 在編譯時使用型別資訊執行轉換,在轉換執行必要的檢測(諸如指標越界計算,型別檢查)。其運算元相對是安全的。而reinterpret_cast 僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換,因此,對於reinterpret_cast需要謹慎使用。