reinterpret_cast 和 static_cast 的區別

Justin_Hu發表於2024-03-28

安全性:

static_cast 是一個安全的型別轉換,它只能轉換具有繼承關係或密切相關的型別,並且在編譯時進行型別檢查。

reinterpret_cast 是一個不安全的型別轉換,它可以將任何型別的指標轉換為任何其他型別的指標,而無需考慮型別安全性。

用途:

static_cast 用於轉換具有繼承關係或密切相關的型別,例如基類和派生類、整數型別和浮點類等。

reinterpret_cast 用於轉換不相關的型別,例如指標型別和整數型別、結構體和聯合體等。

使用場景

static_cast

  • 從基類轉換為派生類
  • 從派生類轉換為基類
  • 從整數型別轉換為浮點型別
  • 從浮點型別轉換為整數型別
  • 從列舉型別轉換為整數型別

reinterpret_cast

  • 將指標型別轉換為整數型別
  • 將整數型別轉換為指標型別
  • 將結構體轉換為聯合體
  • 將聯合體轉換為結構體
  • 將函式指標轉換為 void* 型別
  • 將 void* 型別轉換為函式指標

示例

static_cast

class Base {
public:
    virtual void print() { std::cout << "Base" << std::endl; }
};

class Derived : public Base {
public:
    void print() override { std::cout << "Derived" << std::endl; }
};

int main() {
    Base* base = new Derived();
    Derived* derived = static_cast<Derived*>(base);  // 安全的型別轉換
    derived->print();  // 輸出:Derived
    return 0;
}

reinterpret_cast

int* ptr = new int(10);
void* voidPtr = reinterpret_cast<void*>(ptr);  // 不安全的型別轉換
int* newPtr = reinterpret_cast<int*>(voidPtr);  // 不安全的型別轉換
std::cout << *newPtr << std::endl;  // 輸出:10

需要注意的是,在使用 reinterpret_cast 時需要格外小心,因為它可能會導致未定義的行為或程式崩潰,如果轉換的型別不相容!

相關文章