C++ 類型轉(zhuǎn)換運(yùn)算符(type conversion operators)主要有四種:static_cast
、dynamic_cast
、const_cast
和 reinterpret_cast
。它們可以用于以下類型:
static_cast
是最常用的類型轉(zhuǎn)換運(yùn)算符,主要用于執(zhí)行基礎(chǔ)數(shù)據(jù)類型之間的轉(zhuǎn)換(如 int 到 double)、空指針和空指針之間的轉(zhuǎn)換、非多態(tài)類型的上下轉(zhuǎn)換以及向上轉(zhuǎn)型(將派生類對象轉(zhuǎn)換為基類對象)。但是,它不能轉(zhuǎn)換不相關(guān)的類型(如將 std::string 轉(zhuǎn)換為 int)。
int num = 42;
double d = static_cast<double>(num); // int to double
int* p1 = nullptr;
int* p2 = static_cast<int*>(p1); // nullptr to int* (unsafe)
class Base {};
class Derived : public Base {};
Derived d;
Base* b = static_cast<Base*>(&d); // Upcasting (Base* to Derived*)
dynamic_cast
主要用于在類的繼承層次結(jié)構(gòu)中執(zhí)行向下轉(zhuǎn)型(將基類對象轉(zhuǎn)換為派生類對象)。它會在運(yùn)行時檢查轉(zhuǎn)換的有效性,如果轉(zhuǎn)換不安全,則返回空指針(對于指針類型)或拋出 std::bad_cast
異常(對于引用類型)。
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* b = new Derived;
Derived* d = dynamic_cast<Derived*>(b); // Downcasting (Base* to Derived*)
const_cast
用于修改類型的常量性或易變性。它可以添加或刪除類型的 const
和 volatile
修飾符。
const int num = 42;
int* p = const_cast<int*>(&num); // Remove const from int*
const char* str = "Hello, World!";
char* cstr = const_cast<char*>(str); // Remove const from char* (unsafe)
reinterpret_cast
提供了一種低級別的類型轉(zhuǎn)換,通常用于位模式的重新解釋。它可以執(zhí)行指針類型之間的轉(zhuǎn)換(包括向上轉(zhuǎn)型和向下轉(zhuǎn)型)、整數(shù)類型與指針類型之間的轉(zhuǎn)換以及同類型指針之間的轉(zhuǎn)換。但是,reinterpret_cast
的轉(zhuǎn)換行為很少是有定義的,因此在使用時要特別小心。
int num = 42;
int* p = #
char* c = reinterpret_cast<char*>(p); // Pointer to int to pointer to char
float f = 3.14f;
int* i = reinterpret_cast<int*>(&f); // Float to int (implementation-defined)
請注意,在使用這些類型轉(zhuǎn)換運(yùn)算符時,務(wù)必確保轉(zhuǎn)換的安全性,以避免產(chǎn)生未定義的行為或運(yùn)行時錯誤。