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
用於移除或新增const
或volatile
屬性。
原理:它不改變表示式的值型別,只改變其值類別。
用法:適用於需要修改被宣告為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;
}
這些型別轉換運算子提供了強大的控制能力,允許開發者在不同場景下進行精確的型別轉換。然而,它們也應謹慎使用,以避免潛在的型別安全問題。