C 風格轉換 (Type)expr 功能過於強大且隱蔽,易導致意外轉換。C++ 提供四個專用轉換操作符,語意明確、編譯器可檢查、便於代碼搜索與維護。
用途:替代大多數 C 風格轉換,用於隱式轉換的逆向操作(如 double → int、基類指針 → 派生類指針但無運行時檢查、void* 轉具體指針)。
double d = 3.14;
int i = static_cast(d); // 截斷小數部分
Base* pb = new Derived();
Derived* pd = static_cast(pb); // 無運行時檢查,程序員需確保安全
限制:不能去除 const、volatile;不能在無關類型間轉換(如 struct → int、double → ptr)。
唯一用途:修改表達式的 const 或 volatile 屬性。
const int ci = 10;
int* p = const_cast(&ci); // 去除 const
*p = 20; // 未定義行為!原對象若真為 const 會導致崩潰
正當場景:調用未正確聲明 const 的舊 API,且確知不會修改對象。
條件:類必須包含虛函數(多態類型)。
行為:
nullptrbad_cast 異常
class Base { virtual void f() {} };
class Derived : public Base {};
Base* pb = new Derived();
Derived* pd = dynamic_cast(pb); // 成功
Base* pb2 = new Base();
Derived* pd2 = dynamic_cast(pb2); // 失敗,返回 nullptr
限制:不能去除 const;不能用於無虛函數的類。
特點:結果幾乎完全由實現定義,不可移植,極度危險。僅用於極少數底層場景(如函數指針轉換、整數與指針互轉)。
typedef void (*FuncPtr)();
FuncPtr fp = reinterpret_cast(&someFunction); // 強制函數指針類型
警告:C++ 不保證所有函數指針表示相同,此類轉換極易產生未定義行為。
| 操作符 | 主要用途 | 關鍵限制 |
|---|---|---|
static_cast | 常規靜態轉換(算術、指針層次、void*) | 不可去除 const;不可轉換無關類型 |
const_cast | 去除/添加 const、volatile | 僅修改 cv 屬性 |
dynamic_cast | 多態層次向下/橫向轉換(運行時檢查) | 需虛函數;不可去除 const |
reinterpret_cast | 位模式重新解釋(指針↔整數、函數指針) | 實現定義;不可移植;極度危險 |
static_cast 替代 C 風格轉換const 唯一用 const_castdynamic_cast 並檢查結果reinterpret_cast,除非編寫底層系統代碼且無他法