資源描述:
《關(guān)于cpp的強(qiáng)制類型轉(zhuǎn)換總結(jié)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換以下內(nèi)容整理自互聯(lián)網(wǎng)。整理人:LybeLiu文中教材指的是《C++語(yǔ)言程序設(shè)計(jì)》(第4版),作者是鄭莉等,清華大學(xué)出版社會(huì)出版。教材上提到這4種轉(zhuǎn)換的地方分別是:P36(概述),P244(reinterpret_cast),P246(const_cast),P337顯式轉(zhuǎn)換也被稱為強(qiáng)制類型轉(zhuǎn)換(cast),包括下列命名的強(qiáng)制類型轉(zhuǎn)換操作符static_castdynamic_castconst_cast和reinterpret_cast。static_cast、const_cast和reinterpret_cast三種類型轉(zhuǎn)換操作符的功能,
2、都可以用標(biāo)準(zhǔn)C++之前的兩種類型轉(zhuǎn)換語(yǔ)法來(lái)描述。之所以細(xì)分,是為了“語(yǔ)義更加明確,也就不容易出錯(cuò)”。static_cast它用來(lái)進(jìn)行比較安全的、基于內(nèi)容的數(shù)據(jù)類型轉(zhuǎn)換(編譯器會(huì)生成代碼進(jìn)行轉(zhuǎn)換)?;緮?shù)據(jù)類型之間的轉(zhuǎn)換都適用于static_cast。用法:static_cast(exdivssion)該運(yùn)算符把exdivssion轉(zhuǎn)換為type-id類型,但沒(méi)有運(yùn)行時(shí)類型檢查來(lái)保證轉(zhuǎn)換的安全性。它主要有如下幾種用法:①用于類層次結(jié)構(gòu)中基類和子類之間指針或引用的轉(zhuǎn)換。進(jìn)行上行轉(zhuǎn)換(把子類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進(jìn)行下行轉(zhuǎn)換(把基類指針
3、或引用轉(zhuǎn)換成子類表示)時(shí),由于沒(méi)有動(dòng)態(tài)類型檢查,所以是不安全的。②用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。這種轉(zhuǎn)換的安全性也要開(kāi)發(fā)人員來(lái)保證。③把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。④把任何類型的表達(dá)式轉(zhuǎn)換成void類型。注意:static_cast不能轉(zhuǎn)換掉exdivssion的const、volatile、或者_(dá)_unaligned屬性。例子:classB{...};classD:publicB{...};voidf(B*pb,D*pd){D*pd2=static_cast(pb);//不安全,pb可能只是B的指針B*p
4、b2=static_cast(pd);//安全的...}reinterpret_cast任何指針都可以轉(zhuǎn)換成其它類型的指針,T必須是一個(gè)指針、引用、算術(shù)類型、指向函數(shù)的指針或指向一個(gè)類成員的指針。表達(dá)式reinterpret_cast(a)能夠用于諸如char*到int*,或者One_class*到Unrelated_class*等類似這樣的轉(zhuǎn)換,因此可能是不安全的。例子:classA{...};classB{...};voidf(){??A*pa=newA;??void*pv=reinterpret_cast(pa);??//pv現(xiàn)在指向了
5、一個(gè)類型為B的對(duì)象,這可能是不安全的??...}reinterpre_cast通常對(duì)于操作數(shù)的位模式執(zhí)行一個(gè)比較低層次的重新解釋,它的正確性很大程度上依賴于程序員的主動(dòng)管理。Areinterpret_castgenerallyperformsalow-levelreinterpretationofthebitpatternofitsoperands,anditscorrectnessinlargepartdependsontheactivemanagementoftheprogrammer.const_cast將數(shù)據(jù)類型中的const屬性去除。表達(dá)式const_c
6、ast(a)被用于從一個(gè)類中去除以下這些屬性:const,volatile,和__unaligned。例子1:voidfoo(constint*cp){int*p=const_cast(cp);//轉(zhuǎn)換以后通過(guò)得到的指針修改cp指向的常量。(*p)++;}例子2:classA{...};voidf(){constA*pa=newA;//const對(duì)象A*pb;//非const對(duì)象//pb=pa;//這里將出錯(cuò),不能將const對(duì)象指針賦值給非const對(duì)象pb=const_cast(pa);//現(xiàn)在OK了...}dynamic_cast通
7、常在基類和派生類之間轉(zhuǎn)換時(shí)使用,是run-timecast。dynamic_cast支持在運(yùn)行時(shí)刻識(shí)別由指針或引用指向的類對(duì)象(Thedynamic_castsupportstherun-timeidentificationofclassobjectsaddressedeitherbyapointerorreference.)轉(zhuǎn)換前類型必須是指向多態(tài)類型的指針(即要有虛函數(shù)),或多態(tài)類型的引用,否則編譯會(huì)出錯(cuò)。這是由于運(yùn)行時(shí)類型檢查需要運(yùn)行時(shí)類型信息,而這個(gè)信息存儲(chǔ)在類的虛函數(shù)表。用法:dynamic_cast(a)該運(yùn)算符把a(bǔ)轉(zhuǎn)換成T類型的對(duì)象。T必須是類
8、的指針、類