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

C++ 四種強制轉型運算子詳細解析

     編輯:關於C++

標準 C++ 提供四種強制轉型運算子,取代 C 風格的 (Type)expr,提供更精確的語意與編譯期檢查。本文詳細說明 static_cast、dynamic_cast、const_cast、reinterpret_cast 的適用場景、安全性與範例。

1. static_cast<T>(expr)

用於相關類型間的轉換:指標/參考轉換、算術型別轉換、列舉轉整數等。不執行執行期型別檢查,效率最高。


class B {}; class D : public B {};
void f(B* pb, D* pd) {
    D* pd2 = static_cast(pb); // 不安全:pb 可能僅指向 B
    B* pb2 = static_cast(pd); // 安全:衍生類指標轉基類
}

2. dynamic_cast<T>(expr)

用於多型類別層級間的「安全向下轉型」。執行期檢查,需啟用 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
}

3. const_cast<T>(expr)

唯一能移除 const、volatile、__unaligned 屬性的轉型。僅改變 cv-qualifiers,不改變底層型別。濫用導致未定義行為。


class A {};
void f() {
    const A* pa = new A;
    A* pb = const_cast(pa); // 移除 const
    // 若原物件真為 const,透過 pb 修改屬 UB
}

4. reinterpret_cast<T>(expr)

最低層級、最危險的轉型:任意指標類型互轉、指標轉整數、函式指標轉換等。純位元重新解釋,無語意檢查,極易導致未定義行為。


class A {}; class B {};
void f() {
    A* pa = new A;
    B* pb = reinterpret_cast(pa); // 極度危險!
}

選擇指南

  1. 優先使用 static_cast(非多型向下轉型)。
  2. 多型向下轉型用 dynamic_cast。
  3. 移除 const 僅用 const_cast。
  4. 極少數底層位元操作才用 reinterpret_cast。
  5. 避免 C 風格 (Type)expr,它混合上述行為且難以搜尋。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved