原則27:盡量少做類型轉(zhuǎn)換動作

這是Effective C++中第27個原則,作者花了很長的篇幅來介紹這一原則梧税。
總而言之一句話,因?yàn)轭愋娃D(zhuǎn)換會導(dǎo)致破壞類型系統(tǒng)称近,從而帶來明顯的和不明顯麻煩第队,而且這是C++獨(dú)有的特性。
C++提供了四種新型的類型轉(zhuǎn)換煌茬,就是下面這四種:



const_cast是把const類型轉(zhuǎn)換成非const類型斥铺;
dynamic_cast是類體系中進(jìn)行轉(zhuǎn)換;
reinterpret_cast是一個很強(qiáng)大的類型轉(zhuǎn)換坛善,最常用的是指針轉(zhuǎn)換為指針晾蜘,而且是兩個毫不相關(guān)的指針之間的轉(zhuǎn)換邻眷,它傳遞的是比特位。換句話說這些比特位是不變的剔交,但是它能按照另一種方式來解釋它肆饶。
static_cast就是平常的類型轉(zhuǎn)換,用的最廣泛岖常。
須知驯镊,在C++中,類型轉(zhuǎn)換往往能夠令編譯器編譯出運(yùn)行時代碼竭鞍,可想而知板惑,這個代碼并不是你寫的。在這里作者舉了一個多態(tài)的例子偎快,當(dāng)你用父類的指針指向子類的對象時冯乘,父類的指針指向的地址和子類對象所在的地址并不是一個,它倆之間有時候是有個偏移量的晒夹。
作者又舉了一個例子●陕現(xiàn)有一父類和其子類,兩類有兩個同名的虛函數(shù)丐怯,現(xiàn)要求子類虛函數(shù)中首先調(diào)用父類虛函數(shù)喷好,這是子類虛函數(shù)的代碼是這樣子的。



通過子類的this指針強(qiáng)制類型轉(zhuǎn)換成父類類型读跷,然后調(diào)用同名函數(shù)梗搅。但是次轉(zhuǎn)換的過程并不是你所想象的那樣簡單,這個強(qiáng)制類型轉(zhuǎn)換會創(chuàng)造出一個被轉(zhuǎn)型對象的副本舔亭,它是在這個副本身上執(zhí)行父類的同名函數(shù)些膨,而在該對象身上執(zhí)行本類專屬的同名函數(shù),兩者本應(yīng)作用于同一個對象而實(shí)際上卻沒有钦铺。而解決這個問題的辦法就是不用強(qiáng)制類型轉(zhuǎn)換订雾,你該用父類的成員函數(shù)就用就行了。
而dynamic_cast這個轉(zhuǎn)換你最好不要用矛洞,因?yàn)樗莿討B(tài)轉(zhuǎn)換洼哎,它會在整個類層次上進(jìn)行尋找,而且每轉(zhuǎn)換一次就尋找一次沼本,并且它是按照類名進(jìn)行字符串匹配的噩峦。
通常你使用dynamic_cast進(jìn)行強(qiáng)制類型轉(zhuǎn)換的情景是用一個父類的指針指向子類對象,這種情況你應(yīng)該使用的是子類類型的只能指針抽兆,作者使用的是一個裝有智能指針的vector识补。如果子類很多,并且你非要用父類類型的話辫红,那你可以在父類中提供一個同名空虛函數(shù)凭涂,并在各個子類中去實(shí)現(xiàn)它祝辣,然后你再用vector去容納裝有父類類型的智能指針,然后去操作切油。為啥要使用vector呢蝙斜?因?yàn)樗穷愋桶踩萜鳌?br> 在這里一定要記住不要在程序中多次使用dynamic_cast做沒有必要的類型轉(zhuǎn)換,因?yàn)檫@樣做不僅代碼多澎胡,而且運(yùn)行慢孕荠,因?yàn)閐ynamic_cast需要查找嘛。

最后作者衷心地告訴大家盡量不要使用強(qiáng)制類型轉(zhuǎn)換攻谁,尤其是除static_cast之外的另外三種稚伍;強(qiáng)制類型轉(zhuǎn)換如果必要,那也要把它包裹在一個函數(shù)里面巢株,不要讓用戶接觸到槐瑞;推薦使用C++強(qiáng)制類型轉(zhuǎn)換,它不僅容易分辨阁苞,而且各司其職。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祠挫,一起剝皮案震驚了整個濱河市那槽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌等舔,老刑警劉巖骚灸,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慌植,居然都是意外死亡甚牲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蝶柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丈钙,“玉大人,你說我怎么就攤上這事交汤〕猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵芙扎,是天一觀的道長星岗。 經(jīng)常有香客問我,道長戒洼,這世上最難降的妖魔是什么俏橘? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮圈浇,結(jié)果婚禮上寥掐,老公的妹妹穿的比我還像新娘靴寂。我一直安慰自己,他們只是感情好曹仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布榨汤。 她就那樣靜靜地躺著,像睡著了一般怎茫。 火紅的嫁衣襯著肌膚如雪收壕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天轨蛤,我揣著相機(jī)與錄音蜜宪,去河邊找鬼。 笑死祥山,一個胖子當(dāng)著我的面吹牛圃验,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缝呕,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼澳窑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了供常?” 一聲冷哼從身側(cè)響起摊聋,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栈暇,沒想到半個月后麻裁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡源祈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年煎源,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香缺。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡手销,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赫悄,到底是詐尸還是另有隱情原献,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布埂淮,位于F島的核電站姑隅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倔撞。R本人自食惡果不足惜讲仰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痪蝇。 院中可真熱鬧鄙陡,春花似錦冕房、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毫捣,卻和暖如春详拙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔓同。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工饶辙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斑粱。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓弃揽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親则北。 傳聞我的和親對象是個殘疾皇子矿微,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

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

  • C++類型轉(zhuǎn)換總結(jié) 本章內(nèi)容:1 前言2 static_cast3 dynamic_cast4 const_cas...
    Haley_2013閱讀 951評論 0 50
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,513評論 1 51
  • 1. C++基礎(chǔ)知識點(diǎn) 1.1 有符號類型和無符號類型 當(dāng)我們賦給無符號類型一個超出它表示范圍的值時,結(jié)果是初始值...
    Mr希靈閱讀 17,969評論 3 82
  • 這篇文章也許會持續(xù)更新尚揣,也歡迎大家提出問題冷冗,一起探討。原文地址AC4Fun,轉(zhuǎn)載請注明出處惑艇。 **********...
    羲牧閱讀 4,820評論 7 23
  • 這種簡筆畫很簡單,但立體效果不強(qiáng)拇泛,本來想涂黑加重彌補(bǔ)毛邊滨巴,卻描越難看,圖形一定要用鉛筆確定好后再用簽字筆描最后的形狀俺叭!
    奔跑的蝸小牛閱讀 244評論 0 0