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

C++ 四大型別轉換運算子完整解析:static_cast、dynamic_cast、reinterpret_cast、const_cast

     編輯:關於C語言

為何棄用 C 風格轉型?

C 風格 (Type)expr 混合了多種語意,編譯器無法精準檢查,易掩蓋錯誤。C++ 提供四個具備明確語意、可編譯期檢查的轉型運算子。

1. static_cast — 編譯期靜態轉型

static_cast(expr)
  • 用途:類別層級上行轉型(安全)、基本型別轉換、void* 轉具體指標、移除 const/volatile(需配合 const_cast)。
  • 特點:無執行期檢查,下行轉型(基類→衍生類)不安全。
  • 限制:無法轉換掉 const/volatile/__unaligned 屬性。

2. dynamic_cast — 執行期安全下行轉型

dynamic_cast(expr)
  • 前提:基類必須有虛函數(需 RTTI 支援,依賴 vtable 的 type_info)。
  • 用途:類別層級下行轉型(安全)、交叉轉型、void* 轉型。
  • 行為:指標轉型失敗回傳 nullptr;引用轉型失敗拋出 std::bad_cast。
  • 效能:執行期類型檢查,比 static_cast 慢。

程式碼對比

class Base { virtual void f() {} };
class Derived : public Base { int extra; };

Base* pb = new Base;
Derived* pd1 = static_cast(pb); // 編譯通過,執行危險
Derived* pd2 = dynamic_cast(pb); // 回傳 nullptr,安全

Base* pb2 = new Derived;
Derived* pd3 = dynamic_cast(pb2); // 成功

// 交叉轉型
class A { virtual void f() {} };
class B : public A {};
class C : public A {};

B* b = new B;
C* c1 = static_cast(b); // 編譯錯誤
C* c2 = dynamic_cast(b); // 回傳 nullptr

3. reinterpret_cast — 位元層級重新解釋

reinterpret_cast(expr)
  • 最危險:單純重新解釋位元模式,無任何型別檢查、無二進制轉換。
  • 用途:指標↔整數互轉、函數指標轉換、無關類別指標強制轉換(如序列化、硬體介面)。
  • 可逆性:指標→整數→原指標類型,值保持不變。

static_cast vs reinterpret_cast 差異

int n = 9;
double d1 = static_cast(n);   // 正確轉換:9.0(補齊位元)
double d2 = reinterpret_cast(n); // 錯誤位元解讀:垃圾值

4. const_cast — 移除/添加 const/volatile

const_cast(expr)
  • 唯一用途:修改 const/volatile 資格。
  • 警告:若原物件真為 const(如字串常數區),透過結果修改導致未定義行為。
const int ci = 10;
int* p = const_cast(&ci);
*p = 20; // UB!ci 可能在唯讀區

// 正當用途:呼叫非 const 介面的舊 API
void legacy_api(int* p);
const int* cptr = &ci;
legacy_api(const_cast(cptr)); // 確保 API 不會修改

選擇指南

場景推薦運算子
基類→衍生類(確知安全)static_cast
基類→衍生類(需執行期驗證)dynamic_cast
基本型別互轉、void* 轉具體指標static_cast
指標↔整數、無關類別強制轉換reinterpret_cast
移除 const/volatileconst_cast

總結

四大轉型運算子各司其職:static_cast 為主力,dynamic_cast 守護多態安全,reinterpret_cast 處理底層位元操作,const_cast 解決舊介面相容。**嚴禁使用 C 風格轉型**,讓編譯器成為你的安全網。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved