C++中強(qiáng)制類型轉(zhuǎn)換方法有哪些

小編給大家分享一下C++中強(qiáng)制類型轉(zhuǎn)換方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為革吉等服務(wù)建站,革吉等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為革吉企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

C中的類型轉(zhuǎn)換:

事情要從頭說起,這個(gè)頭就是C語(yǔ)言.我們已經(jīng)習(xí)慣了使用C-like類型轉(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)換太過隨意,可以在任意類型之間轉(zhuǎn)換。你可以把一個(gè)指向const對(duì)象的指針轉(zhuǎn)換成指向非const對(duì)象的指針,把一個(gè)指向基類對(duì)象的指針轉(zhuǎn)換成一個(gè)派生類對(duì)象的指針,這些轉(zhuǎn)換之間的差距是非常巨大的,但是傳統(tǒng)的C語(yǔ)言風(fēng)格的類型轉(zhuǎn)換沒有區(qū)分這些。

2.C風(fēng)格的轉(zhuǎn)換沒有統(tǒng)一的關(guān)鍵字和標(biāo)示符。對(duì)于大型系統(tǒng),做代碼排查時(shí)容易遺漏和忽略。

C++中的類型轉(zhuǎn)換:

C++風(fēng)格完美的解決了上面兩個(gè)問題。1.對(duì)類型轉(zhuǎn)換做了細(xì)分,提供了四種不同類型轉(zhuǎn)換,以支持不同需求的轉(zhuǎn)換;2.類型轉(zhuǎn)換有了統(tǒng)一的標(biāo)示符,利于代碼排查和檢視。下面分別來介紹這四種轉(zhuǎn)換:static_cast、dynamic_cast、const_cast和reinterpreter_cast.

  • static_cast,命名上理解是靜態(tài)類型轉(zhuǎn)換。如int轉(zhuǎn)換成char。

  • dynamic_cast,命名上理解是動(dòng)態(tài)類型轉(zhuǎn)換。如子類和父類之間的多態(tài)類型轉(zhuǎn)換。

  • const_cast,字面上理解就是去const屬性。

  • reinterpreter_cast,僅僅重新解釋類型,但沒有進(jìn)行二進(jìn)制的轉(zhuǎn)換。

一、static_cast轉(zhuǎn)換

1.基本用法:static_cast expression

2.使用場(chǎng)景

a、用于類層次結(jié)構(gòu)中基類和派生類之間指針或引用的轉(zhuǎn)換

上行轉(zhuǎn)換(派生類—->基類)是安全的;

下行轉(zhuǎn)換(基類—->派生類)由于沒有動(dòng)態(tài)類型檢查,所以是不安全的。

b、用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換為char,這種帶來安全性問題由程序員來保證

c、把空指針轉(zhuǎn)換成目標(biāo)類型的空指針

d、把任何類型的表達(dá)式轉(zhuǎn)為void類型

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<double>(n); // 基本類型轉(zhuǎn)換int *pn = &n;double *d = static_cast<double *>(&n) //無關(guān)類型指針轉(zhuǎn)換,編譯錯(cuò)誤void *p = static_cast<void *>(pn); //任意類型轉(zhuǎn)換成void類型

二、dynamic_cast轉(zhuǎn)換

1.基本用法:dynamic_cast expression

2.使用場(chǎng)景:只有在派生類之間轉(zhuǎn)換時(shí)才使用dynamic_cast,type-id必須是類指針,類引用或者void*。

3.使用特點(diǎn)

a、基類必須要有虛函數(shù),因?yàn)閐ynamic_cast是運(yùn)行時(shí)類型檢查,需要運(yùn)行時(shí)類型信息,而這個(gè)信息是存儲(chǔ)在類的虛函數(shù)表中,只有一個(gè)類定義了虛函數(shù),才會(huì)有虛函數(shù)表(如果一個(gè)類沒有虛函數(shù),那么一般意義上,這個(gè)類的設(shè)計(jì)者也不想它成為一個(gè)基類)。

b、對(duì)于下行轉(zhuǎn)換,dynamic_cast是安全的(當(dāng)類型不一致時(shí),轉(zhuǎn)換過來的是空指針),而static_cast是不安全的(當(dāng)類型不一致時(shí),轉(zhuǎn)換過來的是錯(cuò)誤意義的指針,可能造成踩內(nèi)存,非法訪問等各種問題)

c、dynamic_cast還可以進(jìn)行交叉轉(zhuǎn)換

class BaseClass 
{public:
  int m_iNum;
  virtual void foo(){};//基類必須有虛函數(shù)。保持多臺(tái)特性才能使用dynamic_cast};class DerivedClass: public BaseClass 
{public:
  char *m_szName[100];
  void bar(){};
};
  
BaseClass* pb = new DerivedClass();
DerivedClass *pd1 = static_cast<DerivedClass *>(pb);//子類->父類,靜態(tài)類型轉(zhuǎn)換,正確但不推薦DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);//子類->父類,動(dòng)態(tài)類型轉(zhuǎn)換,正確BaseClass* pb2 = new BaseClass();//父類->子類,靜態(tài)類型轉(zhuǎn)換,危險(xiǎn)!訪問子類m_szName成員越界DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);//父類->子類,動(dòng)態(tài)類型轉(zhuǎn)換,安全的。結(jié)果是NULLDerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);

三、const_cast轉(zhuǎn)換

1.基本用法:const_castexpression

2.使用場(chǎng)景

a、常量指針轉(zhuǎn)換為非常量指針,并且仍然指向原來的對(duì)象

b、常量引用被轉(zhuǎn)換為非常量引用,并且仍然指向原來的對(duì)象

3.使用特點(diǎn)

a、cosnt_cast是四種類型轉(zhuǎn)換符中唯一可以對(duì)常量進(jìn)行操作的轉(zhuǎn)換符

b、去除常量性是一個(gè)危險(xiǎn)的動(dòng)作,盡量避免使用。一個(gè)特定的場(chǎng)景是:類通過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類型,編譯錯(cuò)誤SA &rb = const_cast<SA&>(ra);
rb.i = 10;

四、reinterpret_cast轉(zhuǎn)換

1.基本用法:reinterpret_castexpression

2.使用場(chǎng)景:不到萬不得已,不用使用這個(gè)轉(zhuǎn)換符,高危操作

3.使用特點(diǎn)

a、reinterpret_cast是從底層對(duì)數(shù)據(jù)進(jìn)行重新解釋,依賴具體的平臺(tái),可移植性差

b、reinterpret_cast可以將整型轉(zhuǎn)換為指針,也可以把指針轉(zhuǎn)換為數(shù)組

c、reinterpret_cast可以在指針和引用里進(jìn)行肆無忌憚的轉(zhuǎn)換

int doSomething(){return 0;};//FuncPtr is 一個(gè)指向函數(shù)的指針,該函數(shù)沒有參數(shù),返回值類型為 voidtypedef void(*FuncPtr)();//10個(gè)FuncPtrs指針的數(shù)組 讓我們假設(shè)你希望(因?yàn)槟承┠涿畹脑颍┌岩粋€(gè)指向下面函數(shù)的指針存//入funcPtrArray數(shù)組:FuncPtr funcPtrArray[10];

funcPtrArray[0] = &doSomething;// 編譯錯(cuò)誤!類型不匹配,reinterpret_cast可以讓編譯器以你的方法去看待它們:funcPtrArrayfuncPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換

以上是C++中強(qiáng)制類型轉(zhuǎn)換方法有哪些的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:C++中強(qiáng)制類型轉(zhuǎn)換方法有哪些
網(wǎng)站鏈接:http://muchs.cn/article30/ghseso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、面包屑導(dǎo)航、定制網(wǎng)站、、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)