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

C++ 四種顯式類型轉換詳解:static_cast、const_cast、reinterpret_cast、dynamic_cast

     編輯:C++ 入門

C++ 四種顯式類型轉換詳解:static_cast、const_cast、reinterpret_cast、dynamic_cast

C++ 引入四種命名轉換運算符,替代 C 風格的 (Type)expr,使意圖明確、便於搜索、安全性更強。

1. static_cast — 良性/窄化轉換

static_cast<Type>(expr)

  • 用途:非多態類層次上行轉換(派生→基類,安全)、基本類型轉換(int→double, double→int)、void* 與具體指針互轉、隱式轉換的顯式調用。
  • 無運行時檢查:下行轉換(基類→派生)不安全,需開發者保證對象真實類型。
  • 不能 去除 const/volatile,不能在不相關類型間轉換。
int i = 0x7fff;
long l = static_cast<long>(i);      // 非強制擴展
int j = static_cast<int>(3.14);       // 窄化,截斷小數
void* vp = &i;
float* fp = static_cast<float*>(vp); // void* → 具體指針

2. const_cast — 去除/添加 const/volatile

const_cast<Type>(expr)

  • 僅修改 const 或 volatile 資格,底層類型必須相同。
  • 常見場景:調用未正確標註 const 的舊式 API,或實現「邏輯常量性」(如 mutable 緩存)。
  • 警告:修改原本為 const 的對象導致未定義行為。
const int ci = 10;
int* p = const_cast<int*>(&ci); // 去除 const
volatile int vi = 0;
int* q = const_cast<int*>(&vi);  // 去除 volatile

3. reinterpret_cast — 重新解釋位模式

reinterpret_cast<Type>(expr)

  • 最危險:將對象視為完全不同類型,僅保證「轉回原類型值不變」。
  • 典型用途:指針 ↔ 整數、函數指針互轉、異構類型指針強轉(如 struct* → char* 逐字節訪問)。
  • 不可用於類層次轉換(無多態支持)。
struct X { int a[100]; };
X x;
int* ip = reinterpret_cast<int*>(&x); // 視為 int 數組
for (int* p = ip; p < ip+100; ++p) *p = 0; // 清零
print(reinterpret_cast<X*>(ip)); // 轉回

4. dynamic_cast — 多態安全下行轉換

dynamic_cast<Type>(expr)

  • 需多態基類(至少有一個虛函數),利用 RTTI 運行時檢查。
  • 指針轉換失敗返回 nullptr;引用轉換失敗拋 bad_cast。
  • 交叉轉換(兄弟類之間)也支持。
  • 性能開銷較大,僅在無法靜態確定類型時使用。
class Base { virtual ~Base() {} };
class Derived : public Base {};
Base* pb = new Derived;
Derived* pd = dynamic_cast<Derived*>(pb); // 成功
Base* pb2 = new Base;
Derived* pd2 = dynamic_cast<Derived*>(pb2); // 失敗,返回 nullptr

對比總結表

運算符主要用途運行時檢查去除 const不相關類型
static_cast良性/窄化/上行/void*無否否
const_castconst/volatile 修改無是否
reinterpret_cast位模式重新解釋無否是
dynamic_cast多態下行/交叉轉換有 (RTTI)否否

最佳實踐建議

  1. 優先用 static_cast,覆蓋 90%+ 場景。
  2. 去 const 只用 const_cast,且極少使用。
  3. reinterpret_cast 只在極底層代碼(序列化、硬件接口)使用,並加詳細註釋。
  4. 多態體系下行轉換用 dynamic_cast,考慮用虛函數/訪問者模式替代。
  5. 絕不使用 C 風格強轉,它混淆了上述所有語義,且難以 grep 搜索。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved