c++的強(qiáng)制類型轉(zhuǎn)換

在C和C++中,強(qiáng)制類型轉(zhuǎn)換時(shí)常出現(xiàn),例如:

創(chuàng)新互聯(lián)公司專注于梁河網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供梁河營銷型網(wǎng)站建設(shè),梁河網(wǎng)站制作、梁河網(wǎng)頁設(shè)計(jì)、梁河網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造梁河網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供梁河網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

void Test ()
{
     int i = 1;     // 隱式類型轉(zhuǎn)換
     double d = i;
     printf("%d, %.2f\n" , i, d);

     int* p = &i; // 強(qiáng)制類型轉(zhuǎn)換
     int address = (int) p;

     printf("%x, %d\n" , p, address);
}

所以,強(qiáng)制類型轉(zhuǎn)化時(shí)常存在,故而C++風(fēng)格的類型轉(zhuǎn)換提供了4種類型轉(zhuǎn)換操作符來應(yīng)對(duì)不同場(chǎng)合的應(yīng)用。它們分別是const_caststatic_cast,dynamic_cast,reinterpreter_cast。

reinterpret_cast操作符用于將一種類型轉(zhuǎn)換為另一種不同的類型。例如

typedef void (* FUNC)();

int DoSomething (int i)
{
     cout<<"DoSomething" <<endl;
     return 0;
}

reinterpret_cast可以編譯器以FUNC的定義方式去看待 DoSomething函數(shù), 所以非常的BUG,下面轉(zhuǎn)換函數(shù)指針的代碼是不可移植的,所以不建議這樣用,并且C++不保證所有的函數(shù)指針都被一樣的使用,所以這樣用有時(shí)會(huì)產(chǎn)生不確定的結(jié)果。

void Test ()
{
     FUNC f = reinterpret_cast< FUNC>(DoSomething );
     f();
}

const_cast最常用的用途就是刪除變量的const屬性,方便賦值。

void Test ()
{
     volatile const int tem = 3;
     int* p = const_cast< int*>(&tem );
     *p = 8;

     cout<<tem<<endl;
}

dynamic_cast用于將一個(gè)子類對(duì)象的指針轉(zhuǎn)換為父類對(duì)象的指針或引用(動(dòng)態(tài)轉(zhuǎn)換)

向上轉(zhuǎn)型:子類對(duì)象->父類指針/引用(不需要轉(zhuǎn)換)

向下轉(zhuǎn)型:父類對(duì)象->子類指針/引用(用dynamic_cast轉(zhuǎn)型是安全的)

一. dynamic_cast只能用于含有虛函數(shù)的類

二. dynamic_cast會(huì)先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回0

class A
{
public :
     virtual void Test(){}
};

class B : public A
{};

void fun (A* pa)
{
   
   B* pb1 = static_cast<B*>(pa);
   B* pb2 = dynamic_cast<B*>(pa);
   

   cout<<"pb1:" <<pb1<< endl;
   cout<<"pb2:" <<pb2<< endl;
}

static_cast類似于C風(fēng)格的強(qiáng)制轉(zhuǎn)換。無條件轉(zhuǎn)換,靜態(tài)類型轉(zhuǎn)換。用于:

1. 基類和子類之間轉(zhuǎn)換:其中子類指針轉(zhuǎn)換成父類指針是安全的;但父類指針轉(zhuǎn)換成子類指針是不安全的。(基類和子類之間的動(dòng)態(tài)類型轉(zhuǎn)換建議用dynamic_cast)

    2. 基本數(shù)據(jù)類型轉(zhuǎn)換。enum, struct, int, char, float等。static_cast不能進(jìn)行無關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。

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

4. 把任何類型的表達(dá)式轉(zhuǎn)換成void類型。

5. static_cast不能去掉類型的const、volitale屬性(用const_cast)。

以上便是對(duì)四種函數(shù)的淺析,如有不足,請(qǐng)多多指教

本文名稱:c++的強(qiáng)制類型轉(zhuǎn)換
鏈接分享:http://muchs.cn/article32/ighhsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(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è)