C 風格轉型 (T)expr 幾乎允許任意類型互轉,且語法難以識別(括號+標識符在 C++ 中無處不在),導致:
static_cast(expr) 等形式在代碼中極其醒目。擁有與舊式轉型相同的威力/限制:數值轉換、指針上行/下行(非多態)、void* 轉具體指針。不能 去除 const。
// C 風格
double res = ((double)first) / second;
// C++ 風格
double res = static_cast(first) / second;
唯一合法去除 const/volatile 的操作。編譯器強制檢查:若嘗試改變除常量性外的類型(如基類指針轉派生類),將報錯。
const SpecialWidget& csw = sw;
update(const_cast(&csw)); // 合法:僅去除 const
update(const_cast(pw)); // 錯誤:試圖做向下轉型
用於「指向基類的指針/引用」→「指向派生類的指針/引用」。失敗時:指針返回 nullptr,引用拋出 std::bad_cast。需基類為多態類型(含虛函數)。
Widget* pw = new SpecialWidget;
SpecialWidget* psw = dynamic_cast(pw);
if (psw) psw->specialFunc(); // 安全
盡可能避免轉型;必須轉型時,使用新式操作符並將其封裝在函數內部,隱藏實現細節。