C++中型別轉換static_cast

海_纳百川發表於2024-11-08

static_cast<type> 是 C++ 中的一種型別轉換方式,用於在編譯期進行靜態型別轉換。與 C 風格的強制型別轉換不同,static_cast 更加安全和明確,因為它只允許特定的型別轉換,避免了潛在的錯誤和歧義。

static_cast 的用法

static_cast<type>(expression)expression 轉換為 type 型別。常見的使用場景包括:

  1. 基本型別轉換:用於將不同的基本資料型別相互轉換,例如 int 轉換為 floatdouble

    int i = 10;
    float f = static_cast<float>(i); // int 轉換為 float
    
  2. 指標和引用的上行轉換(upcasting):在繼承體系中,static_cast 可以安全地將派生類指標或引用轉換為基類指標或引用。

    class Base {};
    class Derived : public Base {};
    
    Derived d;
    Base* b = static_cast<Base*>(&d); // Derived* 轉換為 Base*
    
  3. 顯式轉換回原始型別:可以用來將列舉、void* 等非相關型別轉換為基本型別(前提是型別是相容的)。

    void* ptr = &i;
    int* intPtr = static_cast<int*>(ptr); // 將 void* 轉換回 int*
    
  4. 避免隱式轉換不當發生:有時建構函式或過載運算子可能引發隱式型別轉換,用 static_cast 可以使轉換更清晰、避免歧義。

static_cast 的限制

  • 不能用於轉換不相關的指標型別。
  • 不檢查轉換的型別安全性。比如,將基類指標強制轉換為派生類指標時需要確保型別正確,否則會導致未定義行為。

示例

#include <iostream>

class Base {};
class Derived : public Base {};

int main() {
    int num = 10;
    double d = static_cast<double>(num); // int 轉換為 double

    Derived derived;
    Base* base = static_cast<Base*>(&derived); // Derived* 轉換為 Base*

    std::cout << d << std::endl; // 輸出 10.0
    return 0;
}

總結

static_cast 是一種型別安全的顯式轉換工具,適合編譯期可確定的轉換需求。

相關文章