小編給大家分享一下C++中強(qiáng)制類(lèi)型轉(zhuǎn)換方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,先為革吉等服務(wù)建站,革吉等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為革吉企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
C中的類(lèi)型轉(zhuǎn)換:
事情要從頭說(shuō)起,這個(gè)頭就是C語(yǔ)言.我們已經(jīng)習(xí)慣了使用C-like類(lèi)型轉(zhuǎn)換,因?yàn)樗鼜?qiáng)大而且簡(jiǎn)單.
主要有一下兩種形式:
(new-type) expression
new-type (expression)
C風(fēng)格的轉(zhuǎn)換格式很簡(jiǎn)單,但是有不少缺點(diǎn):
1.轉(zhuǎn)換太過(guò)隨意,可以在任意類(lèi)型之間轉(zhuǎn)換。你可以把一個(gè)指向const對(duì)象的指針轉(zhuǎn)換成指向非const對(duì)象的指針,把一個(gè)指向基類(lèi)對(duì)象的指針轉(zhuǎn)換成一個(gè)派生類(lèi)對(duì)象的指針,這些轉(zhuǎn)換之間的差距是非常巨大的,但是傳統(tǒng)的C語(yǔ)言風(fēng)格的類(lèi)型轉(zhuǎn)換沒(méi)有區(qū)分這些。
2.C風(fēng)格的轉(zhuǎn)換沒(méi)有統(tǒng)一的關(guān)鍵字和標(biāo)示符。對(duì)于大型系統(tǒng),做代碼排查時(shí)容易遺漏和忽略。
C++中的類(lèi)型轉(zhuǎn)換:
C++風(fēng)格完美的解決了上面兩個(gè)問(wèn)題。1.對(duì)類(lèi)型轉(zhuǎn)換做了細(xì)分,提供了四種不同類(lèi)型轉(zhuǎn)換,以支持不同需求的轉(zhuǎn)換;2.類(lèi)型轉(zhuǎn)換有了統(tǒng)一的標(biāo)示符,利于代碼排查和檢視。下面分別來(lái)介紹這四種轉(zhuǎn)換:static_cast、dynamic_cast、const_cast和reinterpreter_cast.
static_cast,命名上理解是靜態(tài)類(lèi)型轉(zhuǎn)換。如int轉(zhuǎn)換成char。
dynamic_cast,命名上理解是動(dòng)態(tài)類(lèi)型轉(zhuǎn)換。如子類(lèi)和父類(lèi)之間的多態(tài)類(lèi)型轉(zhuǎn)換。
const_cast,字面上理解就是去const屬性。
reinterpreter_cast,僅僅重新解釋類(lèi)型,但沒(méi)有進(jìn)行二進(jìn)制的轉(zhuǎn)換。
一、static_cast轉(zhuǎn)換
1.基本用法:static_cast expression
2.使用場(chǎng)景:
a、用于類(lèi)層次結(jié)構(gòu)中基類(lèi)和派生類(lèi)之間指針或引用的轉(zhuǎn)換
上行轉(zhuǎn)換(派生類(lèi)—->基類(lèi))是安全的;
下行轉(zhuǎn)換(基類(lèi)—->派生類(lèi))由于沒(méi)有動(dòng)態(tài)類(lèi)型檢查,所以是不安全的。
b、用于基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換為char,這種帶來(lái)安全性問(wèn)題由程序員來(lái)保證
c、把空指針轉(zhuǎn)換成目標(biāo)類(lèi)型的空指針
d、把任何類(lèi)型的表達(dá)式轉(zhuǎn)為void類(lèi)型
3.使用特點(diǎn)
a、主要執(zhí)行非多態(tài)的轉(zhuǎn)換操作,用于代替C中通常的轉(zhuǎn)換操作
b、隱式轉(zhuǎn)換都建議使用static_cast進(jìn)行標(biāo)明和替換
int n = 6;double d = static_cast(n); // 基本類(lèi)型轉(zhuǎn)換int *pn = &n;double *d = static_cast (&n) //無(wú)關(guān)類(lèi)型指針轉(zhuǎn)換,編譯錯(cuò)誤void *p = static_cast (pn); //任意類(lèi)型轉(zhuǎn)換成void類(lèi)型
二、dynamic_cast轉(zhuǎn)換
1.基本用法:dynamic_cast expression
2.使用場(chǎng)景:只有在派生類(lèi)之間轉(zhuǎn)換時(shí)才使用dynamic_cast,type-id必須是類(lèi)指針,類(lèi)引用或者void*。
3.使用特點(diǎn):
a、基類(lèi)必須要有虛函數(shù),因?yàn)閐ynamic_cast是運(yùn)行時(shí)類(lèi)型檢查,需要運(yùn)行時(shí)類(lèi)型信息,而這個(gè)信息是存儲(chǔ)在類(lèi)的虛函數(shù)表中,只有一個(gè)類(lèi)定義了虛函數(shù),才會(huì)有虛函數(shù)表(如果一個(gè)類(lèi)沒(méi)有虛函數(shù),那么一般意義上,這個(gè)類(lèi)的設(shè)計(jì)者也不想它成為一個(gè)基類(lèi))。
b、對(duì)于下行轉(zhuǎn)換,dynamic_cast是安全的(當(dāng)類(lèi)型不一致時(shí),轉(zhuǎn)換過(guò)來(lái)的是空指針),而static_cast是不安全的(當(dāng)類(lèi)型不一致時(shí),轉(zhuǎn)換過(guò)來(lái)的是錯(cuò)誤意義的指針,可能造成踩內(nèi)存,非法訪問(wèn)等各種問(wèn)題)
c、dynamic_cast還可以進(jìn)行交叉轉(zhuǎn)換
class BaseClass {public: int m_iNum; virtual void foo(){};//基類(lèi)必須有虛函數(shù)。保持多臺(tái)特性才能使用dynamic_cast};class DerivedClass: public BaseClass {public: char *m_szName[100]; void bar(){}; }; BaseClass* pb = new DerivedClass(); DerivedClass *pd1 = static_cast(pb);//子類(lèi)->父類(lèi),靜態(tài)類(lèi)型轉(zhuǎn)換,正確但不推薦DerivedClass *pd2 = dynamic_cast (pb);//子類(lèi)->父類(lèi),動(dòng)態(tài)類(lèi)型轉(zhuǎn)換,正確BaseClass* pb2 = new BaseClass();//父類(lèi)->子類(lèi),靜態(tài)類(lèi)型轉(zhuǎn)換,危險(xiǎn)!訪問(wèn)子類(lèi)m_szName成員越界DerivedClass *pd21 = static_cast (pb2);//父類(lèi)->子類(lèi),動(dòng)態(tài)類(lèi)型轉(zhuǎn)換,安全的。結(jié)果是NULLDerivedClass *pd22 = dynamic_cast (pb2);
三、const_cast轉(zhuǎn)換
1.基本用法:const_castexpression
2.使用場(chǎng)景:
a、常量指針轉(zhuǎn)換為非常量指針,并且仍然指向原來(lái)的對(duì)象
b、常量引用被轉(zhuǎn)換為非常量引用,并且仍然指向原來(lái)的對(duì)象
3.使用特點(diǎn):
a、cosnt_cast是四種類(lèi)型轉(zhuǎn)換符中唯一可以對(duì)常量進(jìn)行操作的轉(zhuǎn)換符
b、去除常量性是一個(gè)危險(xiǎn)的動(dòng)作,盡量避免使用。一個(gè)特定的場(chǎng)景是:類(lèi)通過(guò)const提供重載時(shí),一般都是非常量函數(shù)調(diào)用const_cast將參數(shù)轉(zhuǎn)換為常量,然后調(diào)用常量函數(shù),然后得到結(jié)果再調(diào)用const_cast 去除常量性。
struct SA { int i; };const SA ra;//ra.i = 10; //直接修改const類(lèi)型,編譯錯(cuò)誤SA &rb = const_cast(ra); rb.i = 10;
四、reinterpret_cast轉(zhuǎn)換
1.基本用法:reinterpret_castexpression
2.使用場(chǎng)景:不到萬(wàn)不得已,不用使用這個(gè)轉(zhuǎn)換符,高危操作
3.使用特點(diǎn):
a、reinterpret_cast是從底層對(duì)數(shù)據(jù)進(jìn)行重新解釋?zhuān)蕾?lài)具體的平臺(tái),可移植性差
b、reinterpret_cast可以將整型轉(zhuǎn)換為指針,也可以把指針轉(zhuǎn)換為數(shù)組
c、reinterpret_cast可以在指針和引用里進(jìn)行肆無(wú)忌憚的轉(zhuǎn)換
int doSomething(){return 0;};//FuncPtr is 一個(gè)指向函數(shù)的指針,該函數(shù)沒(méi)有參數(shù),返回值類(lèi)型為 voidtypedef void(*FuncPtr)();//10個(gè)FuncPtrs指針的數(shù)組 讓我們假設(shè)你希望(因?yàn)槟承┠涿畹脑颍┌岩粋€(gè)指向下面函數(shù)的指針存//入funcPtrArray數(shù)組:FuncPtr funcPtrArray[10]; funcPtrArray[0] = &doSomething;// 編譯錯(cuò)誤!類(lèi)型不匹配,reinterpret_cast可以讓編譯器以你的方法去看待它們:funcPtrArrayfuncPtrArray[0] = reinterpret_cast(&doSomething);//不同函數(shù)指針類(lèi)型之間進(jìn)行轉(zhuǎn)換
以上是C++中強(qiáng)制類(lèi)型轉(zhuǎn)換方法有哪些的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!