首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 四大類型轉換運算子完整指南

     編輯:關於C++

C 風格強制轉型 (Type)expr 混淆了多種語意,且易掩蓋錯誤。C++ 引入四個具備明確語意、可被搜尋、編譯器可檢查的模板式轉型運算子:

1. reinterpret_cast — 位元重新解釋(編譯期)

用途:指標間互轉、指標↔整數轉換。不改變位元模式,僅重新解釋型別。

double d = 9.3;
double* pd = &d;
int* pi = reinterpret_cast<int*>(pd);        // 指標互轉
uintptr_t addr = reinterpret_cast<uintptr_t>(pd); // 指標轉整數

限制:不可用於非指標型別(如 int → double)、不可移除 const/volatile、不可將 const T* 轉 void*(需先 const_cast)。

2. const_cast — 移除/添加 cv 資格(編譯期)

唯一合法用途:移除 const/volatile 傳遞給不支援 const 的舊式 API(且確知物件原本非 const)。

const int* pci = &x;
int* pi = const_cast<int*>(pci);      // 移除 const
const int* pci2 = const_cast<const int*>(pi); // 添加 const

限制:僅限指標/參考型別;不可用於值型別(const_cast<int>(x) 編譯失敗)。修改原本為 const 的物件 → 未定義行為。

3. static_cast — 靜態型別轉換(編譯期)

適用場景:

  • 算術型別隱式轉換的顯式化:double d = static_cast<double>(i);
  • 類別層次向上轉型(安全):Base* pb = static_cast<Base*>(pd);
  • 向下轉型(程式設計師保證安全):Derived* pd = static_cast<Derived*>(pb); — 無執行期檢查,錯誤導致 UB。
  • void* 取回原型別:T* p = static_cast<T*>(vp);
  • 列舉類別轉底層型別、enum class 雙向轉換。

不可用於:非相關類別指標互轉、移除 const、指標↔整數(需 reinterpret_cast)。

4. dynamic_cast — 執行期多型安全轉型

前提:來源型別為多型類別(至少有一個虛函數)。

  • 指標版:轉型失敗返回 nullptr。
  • 參考版:轉型失敗拋出 std::bad_cast。
Shape* sp = new Circle;
Circle* cp = dynamic_cast<Circle*>(sp);  // 成功
Triangle* tp = dynamic_cast<Triangle*>(sp); // 失敗,返回 nullptr

機制:執行期檢查 RTTI(vptr 指向的型別資訊),支援橫向轉型(兄弟類別間)與虛擬繼承下的指標調整。

效能:比 static_cast 慢(需走型別資訊鏈),熱點路徑避免使用;若確定型別安全,改用 static_cast。

選擇決策樹

  1. 只需算術/列舉/向上轉型/void* 還原 → static_cast
  2. 需移除 const/volatile → const_cast
  3. 指標位元重新解釋/指標↔整數 → reinterpret_cast
  4. 多型層次向下/橫向轉型且需執行期安全 → dynamic_cast

最佳實踐

  • 盡量避免轉型:善用多型、模板、std::variant/any(C++17)。
  • 轉型集中在邊界層(序列化、外部 API、舊代碼整合)。
  • 用 static_cast 替代 C 風格轉型,編譯器會攔截更多錯誤。
  • dynamic_cast 失敗通常暗示設計缺陷(違反 LSP),優先重構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved