Q:什么是C風(fēng)格轉(zhuǎn)換?什么是static_cast, dynamic_cast 以及 reinterpret_cast?區(qū)別是什么?為什么要注意? A:轉(zhuǎn)換的含義是通過改變一個(gè)變量的類型為別的類型從而改變該變量的表示方式。為了類型轉(zhuǎn)換一個(gè)簡單對象為另一個(gè)對象你會使用傳統(tǒng)的類型轉(zhuǎn)換操作符。比如,為了轉(zhuǎn)換一個(gè)類型為doubole的浮點(diǎn)數(shù)的指針到整型:代碼: int i; double d; i = (int) d;或者:i = int (d);
對于具有標(biāo)準(zhǔn)定義轉(zhuǎn)換的簡單類型而言工作的很好。然而,這樣的轉(zhuǎn)換符也能不分皂白的應(yīng)用于類(class)和類的指針。ANSI-C++標(biāo)準(zhǔn)定義了四個(gè)新的轉(zhuǎn)換符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制類(class)之間的類型轉(zhuǎn)換。代碼: - reinterpret_cast<new_type>(expression)
- dynamic_cast<new_type>(expression)
- static_cast<new_type>(expression)
- const_cast<new_type>(expression)
static_cast:靜態(tài)類型轉(zhuǎn)換?const_cast:常量類型轉(zhuǎn)換dynamic_cast:動(dòng)態(tài)類型轉(zhuǎn)換reinterpret_cast:重新解釋類型轉(zhuǎn)換1、dynamic_cast運(yùn)算符 該轉(zhuǎn)換符用于將一個(gè)指向派生類的基類指針或引用轉(zhuǎn)換為派生類的指針或引用。 注意:dynamic_cast轉(zhuǎn)換符只能用于含有虛函數(shù)的類,其表達(dá)式為?dynamic_cast<類型>(表達(dá)式) 其中的類型是指把表達(dá)式要轉(zhuǎn)換成的目標(biāo)類型,比如含有虛函數(shù)的基類B和從基類B派生出的派生類D,則: B *pb;? D *pd, md; ? pb = &md;? pd = dynamic_cast<D *>(pb);? 最后一條語句表示把指向派生類D的基類指針pb轉(zhuǎn)換為派生類D的指針,然后將這個(gè)指針賦給派生類D的指針pd,有人可能會覺得這樣做沒有意義,既然指針pd要指向派生類為什么不pd = &md;這樣做更直接呢?有些時(shí)候我們需要強(qiáng)制轉(zhuǎn)換,比如如果指向派生類的基類指針B想訪問派生類D中的除虛函數(shù)之外的成員時(shí)就需要把該指針轉(zhuǎn)換為指向派生類D的指針,以達(dá)到訪問派生類D中特有的成員的目的,比如派生類D中含有特有的成員函數(shù)g(),這時(shí)可以這樣來訪問該成員dynamic_cast<D *>(pb)->g();因?yàn)閐ynamic_cast轉(zhuǎn)換后的結(jié)果是一個(gè)指向派生類的指針,所以可以這樣訪問派生類中特有的成員。但是該語句不影響原來的指針的類型,即基類指針pb仍然是指向基類B的。如果單獨(dú)使用該指針仍然不能訪問派生類中特有的成員。一般情況下不推見這樣使用dynamic_cast轉(zhuǎn)換符,因?yàn)閐ynamic_cast的轉(zhuǎn)換并不會總是成功的,具體情況在后面介紹。 ? dynamic_cast的注意事項(xiàng) dynamic_cast轉(zhuǎn)換符只能用于指針或者引用。dynamic_cast轉(zhuǎn)換符只能用于含有虛函數(shù)的類。dynamic_cast轉(zhuǎn)換操作符在執(zhí)行類型轉(zhuǎn)換時(shí)首先將檢查能否成功轉(zhuǎn)換,如果能成功轉(zhuǎn)換則轉(zhuǎn)換之,如果轉(zhuǎn)換失敗,如果是指針則反回一個(gè)0值,如果是轉(zhuǎn)換的是引用,則拋出一個(gè)bad_cast異常,所以在使用dynamic_cast轉(zhuǎn)換之間應(yīng)使用if語句對其轉(zhuǎn)換成功與否進(jìn)行測試,比如pd = dynamic_cast(pb); if(pd){…}else{…},或者這樣測試if(dynamic_cast(pb)){…}else{…}。 ? 因此,dynamic_cast操作符一次執(zhí)行兩個(gè)操作。首先驗(yàn)證被請求的轉(zhuǎn)換是否有效,只有轉(zhuǎn)換有效,操作符才實(shí)際進(jìn)行轉(zhuǎn)換。基類的指針可以賦值為指向派生類的對象,同樣,基類的引用也可以用派生類對象初始化,因此,dynamic_cast操作符執(zhí)行的驗(yàn)證必須在運(yùn)行時(shí)進(jìn)行。 ? 2、const_cast操作符 其表達(dá)式為?const_cast<類型>(表達(dá)式), 其中類型指要把表達(dá)式轉(zhuǎn)換為的目標(biāo)類型。該操作符用于改變const和volatile,const_cast最常用的用途就是刪除const屬性,如果某個(gè)變量在大多數(shù)時(shí)候是常量,而在某個(gè)時(shí)候又是需要修改的,這時(shí)就可以使用const_cast操作符了。 const_cast操作符不能改變類型的其他方面,他只能改變const或volatile,即const_cast不能把int改變?yōu)閐ouble,但可以把const int改變?yōu)閕nt。const_cast只能用于指針或引用。 const_cast的用法舉例 比如:int a=3; const int *b=&a; int* c=const_cast(b); *c=4; cout<<a<<*c;這時(shí)輸出兩個(gè)4,如果不使用const_cast轉(zhuǎn)換符則常量指針*c的值是不能改變的,在這里使用const_cast操作符,通過指針b就能改變常量指針和變量a的值。 ? 3、static_cast操作符 該操作符用于非多態(tài)類型的轉(zhuǎn)換,任何標(biāo)準(zhǔn)轉(zhuǎn)換都可以使用他,即static_cast可以把int轉(zhuǎn)換為double,但不能把兩個(gè)不相關(guān)的類對象進(jìn)行轉(zhuǎn)換,比如類A不能轉(zhuǎn)換為一個(gè)不相關(guān)的類B類型。static_cast本質(zhì)上是傳統(tǒng)c語言強(qiáng)制轉(zhuǎn)換的替代品。 ? static_cast(靜態(tài)轉(zhuǎn)換)執(zhí)行非多態(tài)的轉(zhuǎn)換,用于代替C中通常的轉(zhuǎn)換操作。因此,被做為隱式類型轉(zhuǎn)換使用。顯式告訴編譯器,不關(guān)心轉(zhuǎn)換后精度損失。比如: int i; float f = 166.7f; i = static_cast<int>(f); 此時(shí)結(jié)果,i的值為166。 4.reinterpret_cast
interpret是解釋的意思,reinterpret即為重新解釋,此標(biāo)識符的意思即為數(shù)據(jù)的二進(jìn)制形式重新解釋,但是不改變其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);這個(gè)轉(zhuǎn)換方式很少使用。
reinterpret_cast運(yùn)算符是用來處理無關(guān)類型之間的轉(zhuǎn)換;它會產(chǎn)生一個(gè)新的值,這個(gè)值會有與原始參數(shù)(expressoin)有完全相同的比特位。
- 從指針類型到一個(gè)足夠大的整數(shù)類型
- 從整數(shù)類型或者枚舉類型到指針類型
- 從一個(gè)指向函數(shù)的指針到另一個(gè)不同類型的指向函數(shù)的指針
- 從一個(gè)指向?qū)ο蟮闹羔樀搅硪粋€(gè)不同類型的指向?qū)ο蟮闹羔?/span>
- 從一個(gè)指向類函數(shù)成員的指針到另一個(gè)指向不同類型的函數(shù)成員的指針
- 從一個(gè)指向類數(shù)據(jù)成員的指針到另一個(gè)指向不同類型的數(shù)據(jù)成員的指針
-
//基本類型指針的類型轉(zhuǎn)換
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast<int*>(pd);??//相當(dāng)于int *pi = (int*)pd;
//不相關(guān)的類的指針的類型轉(zhuǎn)換
class A{};
class B{};
A* pa = new A;
B* pb = reinterpret_cast<B*>(pa);???//相當(dāng)于B* pb = (B*)pa;
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。