您好,登錄后才能下訂單哦!
在C和C++中,強(qiáng)制類型轉(zhuǎn)換時(shí)常出現(xiàn),例如:
void Test () { int i = 1; // 隱式類型轉(zhuǎn)換 double d = i; printf("%d, %.2f\n" , i, d); int* p = &i; // 強(qiáng)制類型轉(zhuǎn)換 int address = (int) p; printf("%x, %d\n" , p, address); }
所以,強(qiáng)制類型轉(zhuǎn)化時(shí)常存在,故而C++風(fēng)格的類型轉(zhuǎn)換提供了4種類型轉(zhuǎn)換操作符來應(yīng)對不同場合的應(yīng)用。它們分別是const_cast,static_cast,dynamic_cast,reinterpreter_cast。
reinterpret_cast操作符用于將一種類型轉(zhuǎn)換為另一種不同的類型。例如
typedef void (* FUNC)(); int DoSomething (int i) { cout<<"DoSomething" <<endl; return 0; }
reinterpret_cast可以編譯器以FUNC的定義方式去看待 DoSomething函數(shù), 所以非常的BUG,下面轉(zhuǎn)換函數(shù)指針的代碼是不可移植的,所以不建議這樣用,并且C++不保證所有的函數(shù)指針都被一樣的使用,所以這樣用有時(shí)會(huì)產(chǎn)生不確定的結(jié)果。
void Test () { FUNC f = reinterpret_cast< FUNC>(DoSomething ); f(); }
const_cast最常用的用途就是刪除變量的const屬性,方便賦值。
void Test () { volatile const int tem = 3; int* p = const_cast< int*>(&tem ); *p = 8; cout<<tem<<endl; }
dynamic_cast用于將一個(gè)子類對象的指針轉(zhuǎn)換為父類對象的指針或引用(動(dòng)態(tài)轉(zhuǎn)換)
向上轉(zhuǎn)型:子類對象->父類指針/引用(不需要轉(zhuǎn)換)
向下轉(zhuǎn)型:父類對象->子類指針/引用(用dynamic_cast轉(zhuǎn)型是安全的)
一. dynamic_cast只能用于含有虛函數(shù)的類
二. dynamic_cast會(huì)先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回0
class A { public : virtual void Test(){} }; class B : public A {}; void fun (A* pa) { B* pb1 = static_cast<B*>(pa); B* pb2 = dynamic_cast<B*>(pa); cout<<"pb1:" <<pb1<< endl; cout<<"pb2:" <<pb2<< endl; }
static_cast類似于C風(fēng)格的強(qiáng)制轉(zhuǎn)換。無條件轉(zhuǎn)換,靜態(tài)類型轉(zhuǎn)換。用于:
1. 基類和子類之間轉(zhuǎn)換:其中子類指針轉(zhuǎn)換成父類指針是安全的;但父類指針轉(zhuǎn)換成子類指針是不安全的。(基類和子類之間的動(dòng)態(tài)類型轉(zhuǎn)換建議用dynamic_cast)
2. 基本數(shù)據(jù)類型轉(zhuǎn)換。enum, struct, int, char, float等。static_cast不能進(jìn)行無關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。
3. 把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。
4. 把任何類型的表達(dá)式轉(zhuǎn)換成void類型。
5. static_cast不能去掉類型的const、volitale屬性(用const_cast)。
以上便是對四種函數(shù)的淺析,如有不足,請多多指教
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。