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

C++ 四大 Cast 與 C 風格轉型深度解析

     編輯:C++ 入門

引言

C++ 提供四種具名轉型運算子,分別針對不同語義場景,比 C 風格的 (Type)expr 更安全、意圖更明確。本文系統梳理它們的適用場景、限制與底層行為。

一、static_cast:靜態類型轉換

  • 用途:非多態類別層級的上下行轉換、基本型別轉換、void* 與具體指標互轉、隱式轉換的顯式化。
  • 特點:編譯期完成,無執行期開銷,不執行動態類型檢查。
  • 風險:基類指標轉派生類指標時,若物件實際非該派生類型,行為未定義。

二、dynamic_cast:動態類型轉換

  • 專屬場景:繼承體系內的指標/引用轉換,要求基類含虛函數(多態)。
  • 執行期檢查:需編譯器支援 RTTI(/GR / -frtti)。
  • 結果:
    • 指標轉換失敗 → 返回 nullptr
    • 引用轉換失敗 → 拋出 std::bad_cast(需 <typeinfo>)
  • 限制:菱形非虛繼承、非 public 繼承會導致轉換失敗/拋出異常。

三、reinterpret_cast:位元重新解讀

  • 本質:單純重新解讀位元模式,**不做任何偏移調整**。
  • 用途:指標 ⇔ 整數、函式指標互轉、不相關類別指標強制轉換(極度危險)。
  • 警示:結果高度依賴實作,可移植性極差,僅用於底層系統程式。

四、const_cast:移除/添加 Const/Volatile

  • 唯一合法用途:移除 const 或 volatile 資格。
  • 未定義行為:若原物件真為 const,透過移除後的引用修改它 → UB。
  • 常見正當場景:呼叫未正確標註 const 的舊式 API、實作「邏輯常態」的快取機制。

五、C 風格轉型 (Type)expr / Type(expr)

  • 行為:編譯器依序嘗試 const_cast → static_cast → static_cast + const_cast → reinterpret_cast → reinterpret_cast + const_cast。
  • 缺陷:意圖模糊、易濫用 reinterpret_cast、難以搜尋審查。
  • 函式式寫法 Type(expr):某些編譯器下確保呼叫建構函式,較 (Type)expr 稍佳,但仍不建議使用。

六、最佳實踐建議

場景推薦 Cast備註
基本型別/非多態層級轉換static_cast明確、高效
多態基類 → 派生類dynamic_cast需 RTTI,檢查失敗處理
移除 const(極少數)const_cast確保物件非常量
指標 ⇔ 整數/底層 Hackreinterpret_cast隔離在平台相關層
其他避免 C 風格用具名 Cast 表達意圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved