C 中的型別強制轉換

2021-04-13 21:34:42 字數 1283 閱讀 7838

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需要謹慎使用。 

C 中型別強制轉換

c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...

C 中的強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...

C 中的強制型別轉換

這幾天修改系統的bug,每天都會遇到一些很 有趣 的事情,寫出來和大家分享。該系統的壽命也不算短,有 五 六年了。開發人員換了多代,問題層出不窮。沒有自動化測試來保障的系統就是這樣,改正乙個bug可能引入更多其它的 bug,錯誤率一直具高不下 開發人員也變的 畏手畏腳 的,不敢對系統進行大膽地重構,...