條款27 盡量少做轉型動作

2021-06-22 09:34:26 字數 1025 閱讀 9526

c++中的轉型語法包括舊式轉型和新式轉型。

舊式轉換包括:

(t) expression //將expression轉型為t,c風格的轉型動作

t(expression) //將expression轉型為t,函式風格的轉型動作

新式轉型包括:

const_cast(expression)

const_cast通常被用來將物件的常量性轉除,也是唯一有此能力的新式轉型操作符。

dynamic_cast(expression)

dynamic_cast主要用來執行「安全向下轉型」,也就是用來決定某物件是否歸屬繼承體系中的某個型別。它是唯一無法由舊式語法執行的動作,也是唯一可能耗費重大執行成本的轉型動作。

reinterpret_cast(expression)
reinterpret_cast意圖執行低階轉型,實際動作(及結果)可能取決於編譯器,這也就表示它不可移植。

static_cast(expression)
static_cast用來強迫隱式轉換。

結論1:如果可以,盡量避免轉型,特別是在注重效率的**中避免dynamic_casts。之所以需要dynamic_cast,通常是因為想在乙個認定為derived class物件身上執行derived class操作函式,但手上卻只有乙個"指向base"的pointer或reference。如果有個設計需要轉型動作,試著發展無需轉型的替代設計。

可行的dynamic_cast替代方案包括「使用型別安全容器」或「將virtual函式往繼承體系上方移動」。

結論2:如果轉型是必要的,試著將它隱藏於某個函式背後。客戶隨後可以呼叫該函式,而不需將轉型放進他們自己的**內。

結論3:寧可使用c++-style(新式)轉型,不要使用舊式轉型。新式轉型很容易辨識出來,而且也比較有著分門別類的功能。

條款27 盡量少做轉型動作

c 的設計目標之一是保證 型別錯誤 絕不會發生。但轉型 cast 破壞了型別系統 type system 舊式轉型,c風格的轉型動作,如下 t tmp 將tmp轉型為t t tmp 同上,函式風格的轉型動作 c 提供四種新式轉型 new style或c style casts 1 const cas...

條款27 盡量少做轉型動作

在談及顯式轉換之前,先簡單說說隱式轉換。int ival 0 ival 3.541 3 doubl向int轉換會丟失精度,編譯器會警告 從double到int轉換可能會丟失資料,結果ival等於6整數3被轉換為double型別,然後執行浮點型別加法操作,得double型別結果6.541,然後將dou...

條款27 盡量少做轉型動作

c 四種新式轉型 通常用來將物件的常量性轉除,將const轉成non const 用來執行 安全向下轉型 通過父類訪問子類 很少用到,忽略 用來強迫隱式轉換,例如將non const物件轉為const物件,或將int轉為double物件,也可以來執行上訴多種轉換的方向轉換,例如將void 指標轉為t...