在C++中,類型轉(zhuǎn)換運算符有四種:static_cast
、dynamic_cast
、const_cast
和reinterpret_cast
。下面是它們的使用方法:
static_cast
:用于執(zhí)行基礎(chǔ)數(shù)據(jù)類型之間的轉(zhuǎn)換(如int到double)、空指針和空指針之間的轉(zhuǎn)換、向上轉(zhuǎn)型(將派生類對象轉(zhuǎn)換為基類對象)等。它是最常用的類型轉(zhuǎn)換運算符。int num = 42;
double d = static_cast<double>(num); // 將int轉(zhuǎn)換為double
class Base {};
class Derived : public Base {};
Derived dobj;
Base bobj = static_cast<Base>(dobj); // 向上轉(zhuǎn)型
dynamic_cast
:用于在類的繼承層次結(jié)構(gòu)中進行安全的向下轉(zhuǎn)型(將基類對象轉(zhuǎn)換為派生類對象)。它會在運行時檢查轉(zhuǎn)換的有效性,如果轉(zhuǎn)換無效,則返回空指針(對于指針類型)或拋出std::bad_cast
異常(對于引用類型)。class Base { virtual void foo() {} };
class Derived : public Base {};
Base* bobj = new Derived;
Derived* dobj = dynamic_cast<Derived*>(bobj); // 向下轉(zhuǎn)型,安全且運行時檢查
const_cast
:用于修改類型的常量性或易變性。它可以添加或刪除類型的const
和volatile
修飾符。const int num = 42;
int* pnum = const_cast<int*>(&num); // 移除const修飾符,但這樣做可能導(dǎo)致未定義行為
const int* cpnum = #
int* ipnum = const_cast<int*>(cpnum); // 移除const修飾符,但這樣做可能導(dǎo)致未定義行為
reinterpret_cast
:用于執(zhí)行低層次的類型轉(zhuǎn)換,如指針類型之間的轉(zhuǎn)換、整數(shù)類型與指針類型之間的轉(zhuǎn)換等。它不提供運行時類型檢查,因此使用reinterpret_cast
可能導(dǎo)致未定義行為。int num = 42;
int* pnum = #
char* cstr = reinterpret_cast<char*>(pnum); // 將int*轉(zhuǎn)換為char*
float f = 3.14f;
int* pi = reinterpret_cast<int*>(&f); // 將float*轉(zhuǎn)換為int*,可能導(dǎo)致未定義行為
請注意,在使用類型轉(zhuǎn)換運算符時,務(wù)必確保轉(zhuǎn)換是合法的,以避免未定義行為和程序錯誤。