日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中四种类型转换方式

發(fā)布時間:2025/3/21 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中四种类型转换方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


C風(fēng)格的強制類型轉(zhuǎn)換(Type Cast)很簡單,不管什么類型的轉(zhuǎn)換統(tǒng)統(tǒng)是:TYPE b = (TYPE)a,但是c 風(fēng)格的類型轉(zhuǎn)換有不少的缺點,有的時候用c風(fēng)格的轉(zhuǎn)換是不合適的,因為它可以在任意類型之間轉(zhuǎn)換,比如你可以把一個指向const對象的指針轉(zhuǎn)換成指向非 const對象的指針,把一個指向基類對象的指針轉(zhuǎn)換成指向一個派生類對象的指針,這兩種轉(zhuǎn)換之間的差別是巨大的,但是傳統(tǒng)的c語言風(fēng)格的類型轉(zhuǎn)換沒有區(qū) 分這些。還有一個缺點就是,c風(fēng)格的轉(zhuǎn)換不容易查找,他由一個括號加上一個標(biāo)識符組成,而這樣的東西在c++程序里一大堆。所以c++為了克服這些缺點,引進了4種類型轉(zhuǎn)換操作符(C++風(fēng)格的強制轉(zhuǎn)換其他的好處是,它們能更清晰的表明它們要干什么。程序員只要掃一眼這樣的代碼,就能立即知道一個強制轉(zhuǎn)換的目的。):

1、static_cast:可以實現(xiàn)C++中內(nèi)置基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換,enum、struct、 int、char、float等。它不能進行無關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。

int c=static_cast<int>(7.987);

如果涉及到類的話,static_cast只能在有相互聯(lián)系的類型中進行相互轉(zhuǎn)換,不一定包含虛函數(shù)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 classA {}; classB:public A {}; classC {}; int main() { ????A* a=newA; ????B* b; ????C* c; ????b=static_cast<B>(a);?// 編譯不會報錯, B類繼承A類 ????c=static_cast<B>(a);?// 編譯報錯, C類與A類沒有任何關(guān)系 ????return1; }

?2、const_cast: const_cast操作不能在不同的種類間轉(zhuǎn)換。相反,它僅僅把一個它作用的表達式轉(zhuǎn)換成常量。它可以使一個本來不是const類型的數(shù)據(jù)轉(zhuǎn)換成const類型的,或者把const屬性去掉。
?3、reinterpret_cast:interpret是解釋的意思,reinterpret即為重新解釋,此標(biāo)識符的意思即為數(shù)據(jù)的二進制形式重新解釋,但是不改變其值。)有著和C風(fēng)格的強制轉(zhuǎn)換同樣的能力。它可以轉(zhuǎn)化任何內(nèi)置的數(shù)據(jù)類型為其他任何的數(shù)據(jù)類型,也可以轉(zhuǎn)化任何指針類型為其他的類型。它甚至可以轉(zhuǎn)化內(nèi)置的數(shù)據(jù)類型為指針,無須考慮類型安全或者常量的情形。不到萬不得已絕對不用。
?4、dynamic_cast:
(1)其他三種都是編譯時完成的,dynamic_cast是運行時處理的,運行時要進行類型檢查。
(2)不能用于內(nèi)置的基本數(shù)據(jù)類型的強制轉(zhuǎn)換。
(3)dynamic_cast轉(zhuǎn)換如果成功的話返回的是指向類的指針或引用,轉(zhuǎn)換失敗的話則會返回NULL。
(4)使用dynamic_cast進行轉(zhuǎn)換的,基類中一定要有虛函數(shù),否則編譯不通過。
??????? 需要檢測有虛函數(shù)的原因:類中存在虛函數(shù),就說明它有想要讓基類指針或引用指向派生類對象的情況,此時轉(zhuǎn)換才有意義。
??????? 這是由于運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數(shù)表(關(guān)于虛函數(shù)表的概念,詳細可見<Inside c++ object model>)中,
??????? 只有定義了虛函數(shù)的類才有虛函數(shù)表。
(5)在類的轉(zhuǎn)換時,在類層次間進行上行轉(zhuǎn)換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉(zhuǎn)換時,dynamic_cast具有類型檢查的功能,比?????????????? static_cast更安全。向上轉(zhuǎn)換即為指向子類對象的向下轉(zhuǎn)換,即將父類指針轉(zhuǎn)化子類指針。向下轉(zhuǎn)換的成功與否還與將要轉(zhuǎn)換的類型有關(guān),即要轉(zhuǎn)換的指針指向的對象的實際類型與轉(zhuǎn)換以后的對象類型一定要相同,否則轉(zhuǎn)換失敗。

例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include<iostream> #include<cstring> usingnamespace std; classA { ???public: ???virtualvoid f() ???{ ???????cout<<"hello"<<endl; ???????}; }; classB:public A { ????public: ????voidf() ????{ ????????cout<<"hello2"<<endl; ????????}; }; classC { ??voidpp() ??{ ??????return; ??} }; int fun() { ????return1; } int main() { ????A* a1=newB;//a1是A類型的指針指向一個B類型的對象 ????A* a2=newA;//a2是A類型的指針指向一個A類型的對象 ????B* b; ????C* c; ????b=dynamic_cast<B*>(a1);//結(jié)果為not null,向下轉(zhuǎn)換成功,a1之前指向的就是B類型的對象,所以可以轉(zhuǎn)換成B類型的指針。 ????if(b==NULL) ????{ ????????cout<<"null"<<endl; ????} ????else ????{ ????????cout<<"not null"<<endl; ????} ????b=dynamic_cast<B*>(a2);//結(jié)果為null,向下轉(zhuǎn)換失敗 ????if(b==NULL) ????{ ????????cout<<"null"<<endl; ????} ????else ????{ ????????cout<<"not null"<<endl; ????} ????c=dynamic_cast<C*>(a);//結(jié)果為null,向下轉(zhuǎn)換失敗 ????if(c==NULL) ????{ ????????cout<<"null"<<endl; ????} ????else ????{ ????????cout<<"not null"<<endl; ????} ????delete(a); ????return0; }

?

同時可以參考下:C++開發(fā)必看 四種強制類型轉(zhuǎn)換的總結(jié)

?

“I find that the harder i work,the more luck i seem to have!”

總結(jié)

以上是生活随笔為你收集整理的C++中四种类型转换方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。