C++ 類型轉(zhuǎn)換

C++添加了四種類型轉(zhuǎn)換運(yùn)算符:

const_cast<type-name>(expression);
static_cast<type-name>(expression);
dynamic_cast<type-name>(expression);
reinterpret_cast<type-name>(expression)

其中type-name表示轉(zhuǎn)換后的類型锋爪,expresion表示被轉(zhuǎn)換的表達(dá)式。

const_cast

const_cast 只能用于改變值的constvolatile屬性。就是把常量轉(zhuǎn)為變量煞额,把變量轉(zhuǎn)為常量波闹。也就是說它的type-nameexpression類型必須相同。

#include<iostream>
class High{};
class Low{};
int main()
{
    High fuck;
    const High* pfuck = &fuck;
    High* ph = const_cast<High*>(pfuck);// 合法;只改變類型屬性驱还。
    Low* pl = const_cast<Low*>(pfuck); // 不合法;除了改變類型屬性外還改變了類型嗜暴。
    return 0;
}

static_cast

static_cast 用于C++內(nèi)置類型之間的轉(zhuǎn)換以及相互聯(lián)系的自定義類之間的轉(zhuǎn)換,但是基本類型指針之間是不能轉(zhuǎn)換的议蟆,因為它們是完全不同的類型闷沥,比如unsigned char*、char*之間是不能用static_cast來轉(zhuǎn)換的咐容,這應(yīng)該使用reinterpret_cast來轉(zhuǎn)換舆逃。

double d = 5.987;
int n = static_cast<int>(d);

假設(shè)High類是Low的基類,而Pond是一個無關(guān)的類戳粒,則從High到Low,從Low到High的轉(zhuǎn)換都是合法的路狮,而從Low或者High到Pond的轉(zhuǎn)換則是不允許的;但是蔚约,對于類層次結(jié)構(gòu)來說奄妨,只有上行轉(zhuǎn)換是安全的,下行轉(zhuǎn)換是不安全的苹祟;另外砸抛,static_cast還可以用于空指針轉(zhuǎn)和任何類型的目標(biāo)指針之間的互相轉(zhuǎn)換以及把任何類型的表達(dá)式轉(zhuǎn)換成void類型。

#include<iostream>
#include<cstdio>
class High{public:void print(){std::cout<<"CLASS HIGH"<<std::endl;}};
class Low:public High{};
class Pond{};
int main()
{
    High bar;
    Low blow;
    High* ph = static_cast<High*>(&blow);   //合法
    Low* pl = static_cast<Low*>(&bar);      //合法
    const Low* ll = static_cast<const Low*>(&bar);  // 合法
    Pond* pp = static_cast<Pond*>(&bar);            //不合法

    void* pv = NULL;
    High* ph = static_cast<High*>(pv);
    ph -> print(); // CLASS HIGH
    High a;
    pv = static_cast<void*>(&a);
    High* phh = static_cast<High*>(pv);
    phh -> print();  // CLASS HIGH

    return 0;
}

dynamic_cast

dynamic_cast是在運(yùn)行階段進(jìn)行的類型轉(zhuǎn)換檢查树枫。它有幾個要點(diǎn):

  • dynamic_cast 只能用于類之間的轉(zhuǎn)換直焙,不能用于內(nèi)置類型之間的轉(zhuǎn)換。
  • dynamic_cast轉(zhuǎn)換如果成功的話返回的是轉(zhuǎn)換后指針或引用砂轻,轉(zhuǎn)換失敗的話則會返回NULL奔誓。
  • 類之間一定要有繼承關(guān)系。
  • 在進(jìn)行向下類型轉(zhuǎn)換的時候基類必須要有虛函數(shù)舔清。
  • 在類層次間進(jìn)行上行轉(zhuǎn)換時丝里,dynamic_cast和static_cast的效果是一樣的曲初;在進(jìn)行下行轉(zhuǎn)換時,dynamic_cast具有類型檢查的功能杯聚,比static_cast更安全臼婆。

所謂上行轉(zhuǎn)換或下行轉(zhuǎn)換就是對于一顆繼承樹而言,從派生類到基類的轉(zhuǎn)換屬于上行轉(zhuǎn)換幌绍,也即向上類型轉(zhuǎn)換颁褂;從基類到派生類的轉(zhuǎn)換屬于下行轉(zhuǎn)換,也即向下類型轉(zhuǎn)換傀广。

#include<iostream>
#include<cstdio>
class High{public:virtual void f(){}};
class Low:public High{};
int main()
{
    High bar;
    Low blow;

    High* ph = dynamic_cast<High*>(&blow); // up
    Low* pl = dynamic_cast<Low*>(&bar); //down;不成功會返回空指針或拋出異常颁独。
    return 0;
}

reinterpret_cast

相當(dāng)于C風(fēng)格的通用類型轉(zhuǎn)換,任意兩個類型之間都可以轉(zhuǎn)換伪冰,但它更多是用于兩個指針之間的轉(zhuǎn)換誓酒,比如,int*和unsigned int*之間贮聂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靠柑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吓懈,更是在濱河造成了極大的恐慌歼冰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻警,死亡現(xiàn)場離奇詭異隔嫡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甘穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門腮恩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扒磁,你說我怎么就攤上這事庆揪。” “怎么了妨托?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵缸榛,是天一觀的道長。 經(jīng)常有香客問我兰伤,道長内颗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任敦腔,我火速辦了婚禮均澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己找前,他們只是感情好糟袁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躺盛,像睡著了一般项戴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上槽惫,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天周叮,我揣著相機(jī)與錄音,去河邊找鬼界斜。 笑死仿耽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的各薇。 我是一名探鬼主播项贺,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼得糜!你這毒婦竟也來了敬扛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤朝抖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谍珊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體治宣,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年砌滞,在試婚紗的時候發(fā)現(xiàn)自己被綠了侮邀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝润,死狀恐怖绊茧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打掘,我是刑警寧澤华畏,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站尊蚁,受9級特大地震影響亡笑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜横朋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一仑乌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦晰甚、人聲如沸衙传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粪牲。三九已至,卻和暖如春止剖,著一層夾襖步出監(jiān)牢的瞬間腺阳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工穿香, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭引,地道東北人。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓皮获,卻偏偏與公主長得像焙蚓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洒宝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容

  • C++類型轉(zhuǎn)換總結(jié) 本章內(nèi)容:1 前言2 static_cast3 dynamic_cast4 const_cas...
    Haley_2013閱讀 949評論 0 50
  • 隱式類型轉(zhuǎn)換: C++的隱式轉(zhuǎn)換發(fā)生在以下四種情況: 在混合類型的算術(shù)表達(dá)式中购公。 在表達(dá)式賦值中。 表達(dá)式傳給函數(shù)...
    CapJon閱讀 633評論 1 2
  • C++ 一共有4種類型轉(zhuǎn)換方式雁歌,分別是: static_cast宏浩,dynamic_cast,const_cast靠瞎,...
    wayyyy閱讀 432評論 0 0
  • static_cast 用于類層次結(jié)構(gòu)中比庄,基類和子類之間指針和引用的轉(zhuǎn)換。進(jìn)行上行轉(zhuǎn)換乏盐,也就是把子類的指針或引用轉(zhuǎn)...
    第八區(qū)閱讀 472評論 0 0
  • 又看了一遍惡作劇之吻父能! 以前看不懂直樹計劃要去服兵役順便留在那個地方當(dāng)醫(yī)生一年多湘琴哭得那么厲害神凑,那么不舍。現(xiàn)在談...
    靜默等你閱讀 249評論 0 0