關(guān)于C風(fēng)格的強制類型轉(zhuǎn)換是程序猿用的最多的一種轉(zhuǎn)換方式, 不管什么類型的轉(zhuǎn)換統(tǒng)統(tǒng)都是TYTE b = (TYPE)a。但是眾所周知C++程序中對類型的檢測非常嚴格,如果類型轉(zhuǎn)換過程中使用C風(fēng)格的類型轉(zhuǎn)換就容易出現(xiàn)一些問題。所以今天傳智播客C/C++專家在這里給大家介紹一下C++風(fēng)格的類型轉(zhuǎn)換的幾種轉(zhuǎn)換操作符以及使用場合。
C++風(fēng)格的類型轉(zhuǎn)換提供了4種類型轉(zhuǎn)換操作符:
const_cast,static_cast,dynamic_cast,reinterpret_cast
4種類型轉(zhuǎn)換的格式,如:TYPE B = static_cast(TYPE)(a)。
struct SA
{
int i;
};
const SA ra;
//ra.i = 10; //直接修改const類型,編譯錯誤
SA &rb = const_cast<SA&>(ra);
rb.i =10;
類似于C風(fēng)格的強制轉(zhuǎn)換。主要應(yīng)用場景:
- 基類和子類之間轉(zhuǎn)換:其中子類指針轉(zhuǎn)換成父類指針是安全的;但父類指針轉(zhuǎn)換成子類指針是不安全的。(基類和子類之間的動態(tài)類型轉(zhuǎn)換建議用dynamic_cast)
- 基本數(shù)據(jù)類型轉(zhuǎn)換。
enum, struct, int, char, float等。static_cast不能進行無關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。
- 把空指針轉(zhuǎn)換成目標類型的空指針。
- 把任何類型的表達式轉(zhuǎn)換成void類型。
- static_cast不能去掉類型的const、volitale屬性(用const_cast)。
int n =6;
// 基本類型轉(zhuǎn)換
double d = static_cast<double>(n);
int*pn =&n;
// 無關(guān)類型指針轉(zhuǎn)換,編譯錯誤
double*d = static_cast<double*>(&n)
// 任意類型轉(zhuǎn)換成void類型
void*p = static_cast<void*>(pn);
有條件轉(zhuǎn)換、動態(tài)類型轉(zhuǎn)換,運行時會進行類型安全檢查(轉(zhuǎn)換失敗返回NULL):
- 安全的基類和子類之間轉(zhuǎn)換。
- 必須要有虛函數(shù)。
- 相同基類不同子類之間的交叉轉(zhuǎn)換。但結(jié)果是NULL。
class ItcastClass
{
public:
int m_iNum;
// 基類必須有虛函數(shù)。保持多臺特性才能使用dynamic_cast
virtual void foo(){};
};
class HeiMaClass: public ItcastClass
{
public:
char*m_szName[100];
void bar(){};
};
ItcastClass* pb =new HeiMaClass();
// 子類->父類,靜態(tài)類型轉(zhuǎn)換,正確但不推薦
HeiMaClass *pd1 = static_cast<HeiMaClass *>(pb);
// 子類->父類,動態(tài)類型轉(zhuǎn)換,正確
HeiMaClass *pd2 = dynamic_cast<HeiMaClass *>(pb);
ItcastClass* pb2 =new ItcastClass();
// 父類->子類,靜態(tài)類型轉(zhuǎn)換,危險!訪問子類m_szName成
員越界
HeiMaClass *pd21 = static_cast<HeiMaClass *>(pb2);
// 父類->子類,動態(tài)類型轉(zhuǎn)換,安全的。結(jié)果是NULL
HeiMaClass *pd22 = dynamic_cast<HeiMaClass *>(pb2);
僅僅重新解釋類型,但沒有進行二進制的轉(zhuǎn)換:
- 轉(zhuǎn)換的類型必須是一個指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。
- 在比特位級別上進行轉(zhuǎn)換。它可以把一個指針轉(zhuǎn)換成一個整數(shù),也可以把一個整數(shù)轉(zhuǎn)換成一個指針(先把一個指針轉(zhuǎn)換成一個整數(shù),在把該整數(shù)轉(zhuǎn)換成原類型的指針,還可以得到原先的指針值)。但不能將非32bit的實例轉(zhuǎn)成指針。
- 最普通的用途就是在函數(shù)指針類型之間進行轉(zhuǎn)換。
- 很難保證移植性。
int doSomething(){return0;};
// FuncPtr 是一個指向函數(shù)的指針,該函數(shù)沒有參數(shù),返回
值類型為 void
typedef void(*FuncPtr)();
// 10個FuncPtrs指針的數(shù)組 讓我們假設(shè)你希望(因為某些莫
名其妙的原因)把一個指向下面函數(shù)的指針存
入funcPtrArray數(shù)組:
FuncPtr funcPtrArray[10];
// 編譯錯誤!類型不匹配,reinterpret_cast可以讓編譯器以你
的方法去看待它們:funcPtrArray
funcPtrArray[0] =&doSomething;
//不同函數(shù)指針類型之間進行轉(zhuǎn)換
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&doSomething);
最后傳智播客C/C++專家再為大家總結(jié)一下以上四種類型轉(zhuǎn)換符的使用場景:
- 去const屬性用const_cast。
- 基本類型轉(zhuǎn)換用static_cast。
- 多態(tài)類之間的類型轉(zhuǎn)換用daynamic_cast。
- 不同類型的指針類型轉(zhuǎn)換用reinterpret_cast。
今天的內(nèi)容就到這里, 祝大家學(xué)習(xí)愉快!
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/c/