C++整理18_型別轉換_

hwaityd發表於2024-10-20

C++ 型別轉換

C++ 提供了四種型別轉換運算子,每種都有其特定的用途和轉換方式。這些運算子利用模板技術實現,以支援不同的資料型別和轉換場景。

1. 靜態型別轉換:static_cast<>()

概念static_cast 是在編譯時執行的型別轉換,用於非多型型別轉換,它不會進行執行時型別檢查。
原理:它基於編譯器的知識,不涉及執行時型別資訊(RTTI)。
用法:適用於基本資料型別之間的轉換,如整數提升、浮點數轉換為整數等,以及類層次結構中向上轉型(從派生類指標轉換為基類指標)。

案例程式碼

class Base { virtual void func() {} };
class Derived : public Base {};

int main() {
    Derived d;
    Base* b = static_cast<Base*>(&d); // 向上轉型,從 Derived* 轉換為 Base*
    int i = 10;
    float f = static_cast<float>(i); // 將 int 轉換為 float
    return 0;
}

2. 動態型別轉換:dynamic_cast<>()

概念dynamic_cast 是在執行時執行的型別轉換,用於類層次結構中的向下轉型(從基類指標轉換為派生類指標)。
原理:它使用執行時型別資訊(RTTI)來檢查轉換的安全性。
用法:只有當轉換是合法的,即物件實際上是目標型別時,轉換才會成功。

案例程式碼

class Base { virtual void func() {} };
class Derived : public Base {};

int main() {
    Base* b = new Derived();
    Derived* d = dynamic_cast<Derived*>(b); // 安全的向下轉型
    if (d) {
        d->func();
    } else {
        cout << "Conversion failed" << endl;
    }
    delete b;
    return 0;
}

3. 重新解釋型別:reinterpret_cast<>()

概念reinterpret_cast 用於將任何指標型別轉換為任何其他指標型別,包括將指標轉換為足夠大的整數型別,反之亦然。
原理:它提供了一種低階別的轉換,不進行任何型別的檢查。
用法:適用於需要重新解釋資料的情況,如處理函式指標、硬體地址等。

案例程式碼

int main() {
    int a = 65; // 'a' is an integer
    int* b = reinterpret_cast<int*>(&a); // 將整數的地址轉換為整數指標
    cout << *b << endl; // 輸出 65
    return 0;
}

4. 常型別轉換(脫去const屬性):const_cast<>()

概念const_cast 用於移除或新增constvolatile屬性。
原理:它不改變表示式的值型別,只改變其值類別。
用法:適用於需要修改被宣告為const的物件的情況。

案例程式碼

void modifyConst(char* p) {
    *p = 'a'; // 錯誤:p 是 const char*
    const_cast<char*>(p)[0] = 'a'; // 正確:移除 const 屬性
}

int main() {
    const char* str = "Hello";
    modifyConst(const_cast<char*>(str));
    cout << str << endl; // 輸出 'aello'
    return 0;
}

這些型別轉換運算子提供了強大的控制能力,允許開發者在不同場景下進行精確的型別轉換。然而,它們也應謹慎使用,以避免潛在的型別安全問題。

相關文章