標準 C++ 提供四種強制轉型運算子,取代 C 風格的 (Type)expr,提供更精確的語意與編譯期檢查。本文詳細說明 static_cast、dynamic_cast、const_cast、reinterpret_cast 的適用場景、安全性與範例。
用於相關類型間的轉換:指標/參考轉換、算術型別轉換、列舉轉整數等。不執行執行期型別檢查,效率最高。
class B {}; class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast(pb); // 不安全:pb 可能僅指向 B
B* pb2 = static_cast(pd); // 安全:衍生類指標轉基類
}
用於多型類別層級間的「安全向下轉型」。執行期檢查,需啟用 RTTI。轉換失敗回傳 nullptr (指標) 或拋出 bad_cast (參考)。
class A { virtual ~A() {} }; class B { virtual ~B() {} };
void f() {
A* pa = new A; B* pb = new B;
void* pv = dynamic_cast(pa); // 指向 A
pv = dynamic_cast(pb); // 指向 B
}
唯一能移除 const、volatile、__unaligned 屬性的轉型。僅改變 cv-qualifiers,不改變底層型別。濫用導致未定義行為。
class A {};
void f() {
const A* pa = new A;
A* pb = const_cast(pa); // 移除 const
// 若原物件真為 const,透過 pb 修改屬 UB
}
最低層級、最危險的轉型:任意指標類型互轉、指標轉整數、函式指標轉換等。純位元重新解釋,無語意檢查,極易導致未定義行為。
class A {}; class B {};
void f() {
A* pa = new A;
B* pb = reinterpret_cast(pa); // 極度危險!
}
static_cast(非多型向下轉型)。dynamic_cast。const 僅用 const_cast。reinterpret_cast。(Type)expr,它混合上述行為且難以搜尋。