cast_name<type>(expression),其中 cast_name 為四種關鍵字之一,type 為目標類型,expression 為待轉換值。
適用場景:
int → double、int → enum 等)void* 通用指針轉回原類型指針void 類型(丟棄值)限制:不能移除 const/volatile/__unaligned 屬性。
唯一用途:增加或移除底層 const/volatile 資格,不改變類型。其他任何 cast 均不能修改常量性。
const char *pc = "hello"; char *p = const_cast<char*>(pc); // 合法,但通過 p 寫入行為未定義 // char *q = static_cast<char*>(pc); // 編譯錯誤
典型應用:函數重載中避免代碼重複——非常量版調用常量版,再用 const_cast 移除返回值的 const。
極度危險:僅重新解釋位模式,不做任何類型檢查。典型用法:指針類型間強制轉換(int* → char*)、指針與整數互轉。
int *ip = new int(42); char *pc = reinterpret_cast<char*>(ip); // pc 指向 int 的第一個字節 // string str(pc); // 錯誤:pc 非真正的 C 風格字符串
原則:除非極度必要(如硬件編程、序列化),否則盡量避免使用。
前提:目標類型必須為多態類型(至少有一個虛函數)。
三種形式:
dynamic_cast<T*>(p):失敗返回 nullptrdynamic_cast<T&>(ref):失敗拋出 bad_cast 異常dynamic_cast<T&&>(expr):C++11 右值引用,失敗拋出異常合法轉換條件(e 為源表達式,T 為目標類型):
e 是 T 的公有派生類e 是 T 的公有基類e 類型即為 T| 場景 | static_cast | dynamic_cast |
|---|---|---|
| 上行轉換 | 安全,編譯期完成 | 安全,運行時檢查(開銷略大) |
| 下行轉換(指針真指向派生對象) | 編譯通過,運行時未定義行為風險 | 安全,返回正確指針 |
| 下行轉換(指針實為基類對象) | 編譯通過,運行時崩潰/邏輯錯誤 | 返回 nullptr,可捕獲 |
| 交叉轉換(多重繼承/無關類) | 編譯錯誤 | 允許,失敗返回 nullptr |
typeid(e) 返回 const type_info&,可比較類型相等、獲取類型名稱typeid(*p) 若 p 為空指針且類型多態 → 拋出 bad_typeiddynamic_cast 實現常基於字符串比較類名,深層繼承/多重繼承開銷大掌握四大 cast 的適用邊界與 dynamic_cast/typeid 的 RTTI 機制,是編寫健壯、可維護 C++ 代碼的關鍵技能。