C 風格強制轉型 (Type)expr 雖然簡便,但存在兩大弊端:過於寬鬆(幾乎允許任意類型互轉)與難以識別(語法僅為一對括號,在代碼中極難搜尋)。為解決這些問題,C++ 引入了四個具備明確語義、可被編譯器檢查、易於查找的新式轉型操作符。
用於編譯期可確定的良性轉換:數值類型互轉、指針向上/向下轉型(無多態)、枚舉與整數互轉等。不能移除 const/volatile,不能轉換不相關類型(如 struct* → int)。
double c = static_cast<double>(a) / b; // 整數除法提升精度
唯一能移除 const/volatile 的轉型。僅改變常量屬性,不能改變類型本身(如基類→派生類)。濫用會導致未定義行為(修改真正的只讀對象)。
update(const_cast<SpecialWidget*>(&csw)); // 移除 const 傳給非 const 參數
專為繼承體系中「安全向下/橫向轉型」設計。要求基類至少有一個虛函數(即多態類型)。轉型失敗時:指針返回 nullptr,引用拋出 std::bad_cast。
第二用途:獲取多重/虛繼承對象的內存起始地址(dynamic_cast<const void*>(this))。
SpecialWidget* psw = dynamic_cast<SpecialWidget*>(pw); // 安全向下轉型
最底層、最危險的轉型:直接按位重新解釋,高度依賴編譯器/平台,不可移植。典型場景:函數指針類型互轉、整數與指針互轉(如哈希表鍵值)。
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // 強行轉換函數指針類型
| 操作符 | 核心用途 | 安全性 | 運行期開銷 |
|---|---|---|---|
| static_cast | 編譯期已知的良性轉換 | 高(編譯期檢查) | 零 |
| const_cast | 移除 const/volatile | 低(程序員擔保) | 零 |
| dynamic_cast | 多態體系安全向下/橫向轉型 | 高(運行期檢查) | 有(RTTI) |
| reinterpret_cast | 位模式重新詮釋 | 極低(平台相關) | 零 |
原則:優先使用
static_cast;僅在必要時用const_cast;多態轉型必用dynamic_cast;reinterpret_cast視為最後手段並封裝在平台適配層。