首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Effective C++ 條款 27:最小化類型轉換——從 C 風格到 C++ 風格的演進

     編輯:關於C++

類型轉換的三種風格

風格語法評價
C 風格(T)expr功能過強(含 const_cast/reinterpret_cast),易濫用、難搜尋
函數風格T(expr)本質同 C 風格,僅括號位置不同
C++ 風格static_cast, dynamic_cast, const_cast, reinterpret_cast語義明確、編譯器檢查更嚴、代碼中易識別

四種 C++ 風格轉換用途

  • const_cast:移除 const/volatile,唯一能做此事。
  • dynamic_cast:安全向下轉型(基類指針/引用 → 派生類),需 RTTI,有運行時代價。
  • reinterpret_cast:低級位模式重新解釋(如指針 ↔ 整數),不可移植,極度危險。
  • static_cast:隱式轉換的逆操作(如 int→double、void*→T*、非 const → const),不能 移除 const。

為何要避免轉換?

  • 破壞類型系統:編譯期保證失效,運行時無類型檢查。
  • 對象地址假設風險:多重繼承下基類子對象地址偏移,強轉指針極易出錯。
  • dynamic_cast 性能陷阱:逐級字符串比較類名,深繼承鏈極慢。

避免轉換的設計替代方案

  1. 使用派生類容器:vector 替代 vector + dynamic_cast。
  2. 虛函數多態:在基類定義虛接口,派生類實現,調用 basePtr->virtualFunc() 替代轉型後調用。
  3. 訪問者模式:雙分派解決「對象類型+操作類型」組合爆炸。

必須轉換時的封裝原則

  • 將轉換隱藏在函數內部,提供類型安全的接口給調用者。
  • 例:Derived* getDerived(Base* p) { return dynamic_cast(p); }。

經典反例:構造函數中調用虛函數的偽轉換

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved