條款27:盡量少做轉型動作
導致任何種類的麻煩,有些容易辨識,有些非常隱晦。
C風格的轉型動作看起來像這樣:
(T)expression //將expression轉型為T
函數風格的轉型動作看起來像這樣:
T(expression) //將expression轉型為T
C++還提供四種新式轉型:
const_cast:通常被用來將對象的常量性轉除;即去掉const。
dynamic_cast:主要用來執行“安全向下轉型”,也就是用來決定某對象是否歸屬繼承體系中的某個類型。
reinterpret_cast:意圖執行低級轉型,實際動作可能取決於編譯器,這也就表示它不可移植。
static_cast:用來強迫隱式轉換,例如將non-const轉型為const,int轉型為double等等。
盡量使用新式轉型:
· 它們很容易在代碼中被辨識出來,因而得以簡化“找出類型系統在哪個地點被破壞”的過程。
· 各轉型動作的目標愈窄化,編譯器愈可能診斷出錯誤的運用。
請記住:
· 如果可以,盡量避免轉型,特別是在注重效率的代碼中避免dynamic_casts。如果有個設計需要轉型動作,試著發展
無需轉型的替代設計。
· 如果轉型是必要的,試著將它隱藏於某個函數背後。客戶隨後可以調用該函數,而不需將轉型放進他們自己的代碼
內。
· 寧可使用C++-style(新式)轉型,不要使用舊式轉型。前者很容易辨識出來,而且也比較有著分門別類的執掌。