www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > CPP開發(fā)者


我們先來回憶以下,C 語言的強制類型轉(zhuǎn)換形式:

 (type) expr;

這種舊式強制類型轉(zhuǎn)換從表現(xiàn)形式上來說不夠清晰明了,容易看漏,一旦轉(zhuǎn)換過程出現(xiàn)問題,追蹤起來也就更加困難。


為了解決以上問題,C++不僅兼容了C的強制轉(zhuǎn)換,來引入了新的轉(zhuǎn)換方法。


強制類型轉(zhuǎn)換的形式:

cast-name<type>(exper);

其中,type是轉(zhuǎn)換的目標(biāo)類型,exper是要轉(zhuǎn)換的值,cast-name 有以下四種:

  1. static_cast

  2. dynamic_cast

  3. const_cast

  4. reinterpret_cast


接下來,我們逐個進行分析。


1、static_cast


這里先介紹下頂層const和底層const的概念:


(1)頂層const,表示指針本身是常量,例如:

int *const p1 = &i;p1 = &j; //編譯報錯,不能修改p1指向++(*p1); //可以,可以修改p1所指向的值的內(nèi)容

(2)底層const,表示指針?biāo)傅膶ο笫且粋€常量,例如:

const int *p2 = &i;p2 = &j; //可以,可以修改p2的指向++(*p2); //編譯報錯,不能修改p2所指向的值的內(nèi)容

那么再來說說static_cast:任何具有明確定義的類型轉(zhuǎn)換,除了不包含底層const,都可以使用 static_cast。例如:

double d = 0.1;void* p = &d; double *dp = static_cast<double*>(p);

static_cast本質(zhì)上是傳統(tǒng)c語言強制轉(zhuǎn)換的替代品。


通常,該操作符用于非多態(tài)類型的轉(zhuǎn)換,任何標(biāo)準(zhǔn)轉(zhuǎn)換都可以使用它。


2、dynamic_cast


用于將基類指針或引用安全的轉(zhuǎn)換成派生類的指針或引用(運行時類型識別)。


dynamic_cast運算符的使用形式如下:

dynamic_cast(e)dynamic_cast(e)dynamic_cast(e)

其中,type必須是一個類類型,并且通常情況下該類型應(yīng)該含有虛函數(shù),在第一種形式中,e必須是有效指針;在第二種形式中,e必須是一個左值,在第三種形式中,e不能是左值。


如果轉(zhuǎn)換目標(biāo)是指針并且轉(zhuǎn)換失敗,則結(jié)果是0,如果轉(zhuǎn)換目標(biāo)是引用并且轉(zhuǎn)換失敗的,則會拋出異常。


因此,dynamic_cast操作符一次執(zhí)行兩個操作。首先驗證被請求的轉(zhuǎn)換是否有效,只有轉(zhuǎn)換有效,操作符才實際進行轉(zhuǎn)換。


3、const_cast


只能用于改變運算對象的底層const(去掉const屬性)

例:

const char *p1;char* p2 = const_cast<char*>(p1);

注意,我們?nèi)サ袅薱onst屬性,編譯器不會再阻止我們對該對象進行寫操作,但要注意,通過p2寫值是未定義行為。


4、reinterpret_cast


該操作符用于將一種類型轉(zhuǎn)換為另一種不同的類型,


比如可以把一個指針類型轉(zhuǎn)換為一個整數(shù),再把整數(shù)轉(zhuǎn)換為指針類型,并且還是原來那個指針。


“通常為運算對象的位模式提供較低層次上的重新解釋“,即是將變量以二進制形式被重新解釋為新的類型,這個操作本質(zhì)是依賴于機器的,也就是說,還需要考慮移植性。要想安全的使用reinterpret_cast,必須對涉及的類型和編譯器實現(xiàn)轉(zhuǎn)換的過程都非常了解。


reinterpret_casts 的最普通的用途,就是在函數(shù)指針類型之間進行轉(zhuǎn)換。


簡單總結(jié)


  1. 基本類型(非多態(tài))的轉(zhuǎn)換用static_cast。

  2. 多態(tài)類之間的類型轉(zhuǎn)換用dynamic_cast。

  3. 去掉const屬性用const_cast。

  4. 不同類型的指針類型轉(zhuǎn)換用reinterpreter_cast。(慎用)

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉