青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Note of Justin

關(guān)于工作和讀書(shū)的筆記

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53229
  • 排名 - 433

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2009-11-12

第十項(xiàng)所言無(wú)他,就是要記得定義拷貝運(yùn)算符時(shí)要返回對(duì)象自身的引用(*this)。原因很簡(jiǎn)單,你會(huì)有連著用=號(hào)的時(shí)候(a=b=c),如果不返回對(duì)象的引用這一串賦值式子就無(wú)法傳遞下去。

Item11說(shuō)的也是拷貝運(yùn)算符,不過(guò)側(cè)重點(diǎn)在使用=號(hào)對(duì)自身賦值的特殊情況(a=a)。再繼續(xù)下去之前Scott先是舉了個(gè)很傻的例子:一個(gè)賦值函數(shù)

class ?Bitmap? { // ..}

class ?Widget? {
// ..
private :
???Bitmap?
* pb;
}

???
Widget
&
Widget::
operator = ( const ?Widget & ?rhs)
{
???delete?pb;
???pb?
= ? new ?Bitmap( * rhs.pb);
???
return ? * this ;
}

這樣的一個(gè)傻傻賦值函數(shù)有兩個(gè)問(wèn)題:
?? 1. 在自賦值的時(shí)候是要出事的。(在自賦值的時(shí)候:pb被釋放之后,緊接著就又被當(dāng)作右值來(lái)構(gòu)造新的對(duì)象……)
?? 2. 在發(fā)生異常的時(shí)候也是要出事的。(設(shè)想如果在new的過(guò)程中出錯(cuò)然后拋出異常,結(jié)果就是我們的pb成了野指針:它指向一個(gè)已經(jīng)delete了的內(nèi)存空間,你無(wú)法再次delete它,也不能讀,因?yàn)槟悴恢滥阕x到的是什么@#¥%)

于是就有了以下應(yīng)付自賦值的策略:

  1. 在函數(shù)入口檢查是否屬于自拷貝(例如:檢查指針是否指向同一片內(nèi)存),如果是,啥也不干直接返回。否則屬于正常情況的拷貝。偷個(gè)懶,用書(shū)上的術(shù)語(yǔ):這樣解決了self-assignment-unsafe的問(wèn)題,但是沒(méi)能避免exception-unsafe。
  2. 第二種方法比較簡(jiǎn)單,只是整理一下指令的順序。但是卻同時(shí)解決了自賦值和拋出異常帶來(lái)的問(wèn)題。繼續(xù)無(wú)恥的抄寫(xiě)代碼一段:
    Widget&
    Widget::
    operator=(const?Widget&?rhs)
    {
    ???Bitmap?
    *pOrig?=?pb;???????????????//?remember?original?pb
    ???pb?=?new?Bitmap(*rhs.pb);??????//?make?pb?point?to?a?copy?of?*pb
    ???delete?pOrig;???????????????????????? //?delete?the?original?pb
    ???return?*this;
    }
    這樣的做法在解決以上兩個(gè)問(wèn)題的同時(shí)卻也降低了執(zhí)行的效率:不論什么情況,這個(gè)賦值函數(shù)都要?jiǎng)?chuàng)建一個(gè)新的Bitmap對(duì)象。
    當(dāng)然,Scott也辯證地道出了第一種方法的額外支出:判斷語(yǔ)句必然地引入了程序的分支(branch),于是指令的預(yù)取(prefetch)、緩沖(caching)、流水線處理(pipelining)的效率就會(huì)被降低。
  3. Copy And Swap。很深?yuàn)W的樣子。實(shí)際上就是改賦值為交換。例子在下面:

    Widget&
    Widget::operator=(Widget?rhs)????//?rhs?is?a?copy?of?the?object
    {?????????????????????????????????????//?passed?in?—?note?pass?by?val
    ???swap(rhs);???????????????????????????//?swap?*this's?data?with
    ????????????????????????????????????? ??????
    //?the?copy's
    ???return?*this;
    }


    利用參數(shù)傳值,隱性的構(gòu)造了一個(gè)Widget對(duì)象。然后將新對(duì)象和本對(duì)象中的數(shù)據(jù)成員交換,達(dá)到為本對(duì)象賦值的效果。新的臨時(shí)對(duì)象在跳出函數(shù)后自動(dòng)銷(xiāo)毀。剛才說(shuō)的兩個(gè)unsafe,都不會(huì)存在。
    不過(guò)又要回來(lái)說(shuō)效率,我總覺(jué)得這樣開(kāi)銷(xiāo)還是大了,無(wú)論什么時(shí)候都要構(gòu)造新的對(duì)象。而且Scott本人也說(shuō)用swap來(lái)完成賦值的做法有點(diǎn)邏輯混淆。不過(guò)他老人家也說(shuō)了,這樣做很有可能讓編譯器生成更有效率的代碼(!!)沒(méi)有驗(yàn)證過(guò),暫且相信吧【等待論證的占位符】

最后要炒的是第12項(xiàng),講的也還是拷貝運(yùn)算符:如何保證在賦值/拷貝的時(shí)候能夠?qū)⑺械某蓡T完整拷貝過(guò)去?對(duì)于簡(jiǎn)單的數(shù)據(jù)成員,編譯器自動(dòng)生成的拷貝函數(shù)可以保證一個(gè)不漏都幫你拷貝;如果是比較復(fù)雜的成員(比如說(shuō)指向一片內(nèi)存空間的指針),編譯器就沒(méi)有足夠的智商把這些成員拷貝到另外一個(gè)對(duì)象中去了。

自己動(dòng)手豐衣足食,還是要自己寫(xiě)。
然而人寫(xiě)的東西終究還是會(huì)有各種問(wèn)題,比如說(shuō):

  1. 在增加類(lèi)成員以后有可能忘記更新拷貝函數(shù)(典型丟三落四……),顯然的結(jié)果就是新增加的數(shù)據(jù)成員沒(méi)有在拷貝函數(shù)中得到關(guān)照,拷貝不完全。
  2. 子類(lèi)的拷貝函數(shù)把自己的成員都拷貝了,但是卻漏了把父類(lèi)對(duì)象的成員拷貝到新的對(duì)象中。

第一個(gè)問(wèn)題沒(méi)人能幫忙,只能靠自己小心。
第二個(gè)問(wèn)題,方法比較直接了:在子類(lèi)的拷貝函數(shù)中調(diào)用父類(lèi)的拷貝函數(shù)(老爸,勞煩您也拷貝一下吧~~),代碼:

Widget &
Widget::
operator ? = ?(Widget?src)??
{
???swap(src);???????????????????????????????????
// copy-and-swap
???WidgetParent:: operator ? = ?(src);?????? // invoking?the?parent's?copy?assignment?operator
??? return ? * this ;
}


最后的最后,通常來(lái)說(shuō)在拷貝函數(shù)和拷貝構(gòu)造函數(shù)中的實(shí)現(xiàn)大多相同,大師就很貼心的提醒:不要在拷貝函數(shù)中調(diào)用拷貝構(gòu)造函數(shù)或者反之。如果真的需要避免代碼的重復(fù),大可定義一個(gè)私有的函數(shù)來(lái)負(fù)責(zé)前面兩者相同的部分。

posted on 2009-12-18 22:18 Justin.H 閱讀(1197) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Effective C++ 炒冷飯
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美国产高清| 欧美激情在线播放| 欧美激情一区二区三区蜜桃视频| 欧美在线综合| 欧美一级黄色网| 欧美专区日韩视频| 久久深夜福利免费观看| 免费一级欧美片在线播放| 欧美高清不卡| 亚洲国产日韩欧美在线图片| 欧美国产日韩一区二区| 亚洲高清不卡| 中文国产成人精品| 久久av红桃一区二区小说| 久久久www成人免费无遮挡大片| 免费成年人欧美视频| 欧美日韩激情网| 国产日产高清欧美一区二区三区| 极品中文字幕一区| 99re亚洲国产精品| 久久国产综合精品| 亚洲国产小视频| 午夜影院日韩| 欧美日韩在线一区二区| 国模 一区 二区 三区| 亚洲狠狠丁香婷婷综合久久久| 日韩一级精品| 久久久精品tv| 亚洲美女毛片| 久久一区亚洲| 国产一二三精品| 亚洲一区二区四区| 美女网站久久| 午夜精品成人在线视频| 欧美成人国产va精品日本一级| 国产精品区二区三区日本| 久久综合色8888| 一本大道久久a久久精品综合| 欧美一级久久久久久久大片| 久久综合伊人| 亚洲欧美卡通另类91av| 欧美成人免费全部观看天天性色| 国产精品毛片大码女人| 亚洲久久一区| 欧美.com| 久久精品九九| 国产中文一区二区三区| 亚洲欧美日韩视频一区| 亚洲欧洲视频| 欧美1区视频| 亚洲福利久久| 欧美成人免费全部| 久久国产精品99精品国产| 国产精品人成在线观看免费| 一区二区三区三区在线| 欧美福利视频在线观看| 久久久久久高潮国产精品视| 国内成人精品2018免费看 | 国产日本欧美一区二区| 亚洲深夜福利网站| 亚洲电影免费在线| 久久夜色精品国产欧美乱| 国产综合色产在线精品| 久久久久久久久伊人| 午夜国产精品视频免费体验区| 国产精品久久久一本精品| 亚洲婷婷免费| 一本一本a久久| 欧美性久久久| 亚洲欧美日韩国产另类专区| 一区二区三区欧美在线| 国产精品免费视频xxxx| 亚洲影视在线播放| 亚洲网在线观看| 国产精品人人做人人爽| 欧美在线视频一区| 午夜精品www| 精品av久久久久电影| 欧美国产在线电影| 欧美日韩精品久久久| 午夜精品av| 久久久99免费视频| 日韩午夜av电影| 亚洲欧美国产三级| 亚洲电影专区| 中国成人在线视频| 国产一区二区精品久久99| 欧美v国产在线一区二区三区| 欧美激情一区二区三区全黄| 亚洲欧美电影在线观看| 久久精品国产一区二区电影| 日韩一级视频免费观看在线| 亚洲视频大全| 在线精品国精品国产尤物884a| 亚洲精品一区二区三区婷婷月| 免费在线观看精品| 午夜视频在线观看一区| 在线成人欧美| 亚洲精品免费一区二区三区| 国产目拍亚洲精品99久久精品| 久久亚洲免费| 欧美日韩高清在线| 久久av资源网| 欧美日本三区| 噜噜噜久久亚洲精品国产品小说| 欧美日韩午夜| 欧美风情在线| 国产亚洲二区| 亚洲免费电影在线观看| 一区二区三区在线观看欧美| 一级日韩一区在线观看| 亚洲国产欧美国产综合一区| 亚洲欧美精品中文字幕在线| 99爱精品视频| 久久一区中文字幕| 欧美在线视频不卡| 欧美区在线观看| 欧美mv日韩mv国产网站| 国产夜色精品一区二区av| av不卡免费看| 亚洲精品四区| 欧美a级一区| 男男成人高潮片免费网站| 国产精品中文字幕在线观看| 一区二区欧美日韩视频| 亚洲精品视频免费观看| 久久综合激情| 裸体一区二区三区| 国内免费精品永久在线视频| 亚洲自拍偷拍视频| 亚洲一级黄色| 欧美日韩一区二区免费在线观看| 免费看av成人| 伊人久久亚洲美女图片| 午夜国产一区| 久久精品一区二区三区不卡牛牛| 欧美三级午夜理伦三级中文幕| 亚洲激情午夜| 这里只有精品电影| 欧美日韩国内| av成人免费观看| 亚洲午夜在线观看视频在线| 欧美日韩国产小视频| 亚洲三级观看| av成人黄色| 国产精品s色| 亚洲一区二区毛片| 欧美伊人久久| 伊人久久男人天堂| 欧美成人精品三级在线观看| 亚洲国产另类精品专区| 99天天综合性| 国产精品亚洲片夜色在线| 欧美在线在线| 欧美激情亚洲国产| 日韩视频不卡中文| 欧美精品一区二区三区一线天视频 | 国产精品影视天天线| 亚洲欧美日韩一区在线观看| 蜜臀av国产精品久久久久| 99精品国产99久久久久久福利| 欧美激情影院| 亚洲欧美日本视频在线观看| 欧美在线视频a| 亚洲观看高清完整版在线观看| 欧美高清自拍一区| 中国成人黄色视屏| 久久视频国产精品免费视频在线| 亚洲大片一区二区三区| 欧美激情精品久久久久| 亚洲一区二区三区欧美 | 亚洲精品美女久久7777777| 在线亚洲国产精品网站| 国产美女精品一区二区三区| 久久久久久综合| 亚洲精品久久| 久久亚洲高清| 亚洲午夜在线观看| 在线观看免费视频综合| 欧美日韩国产bt| 欧美中日韩免费视频| 亚洲国产综合91精品麻豆| 亚洲免费中文| 91久久久久久久久| 国产精品一区视频| 欧美日韩精品久久久| 久久精品国产免费观看| 91久久久在线| 美女精品网站| 久久精品二区亚洲w码| 亚洲色图自拍| 亚洲国产精品毛片| 国产亚洲日本欧美韩国| 欧美视频免费在线观看| 老司机凹凸av亚洲导航| 久久av一区二区| 午夜精品久久久久久久99水蜜桃 | 午夜欧美大片免费观看| 亚洲另类在线视频| 亚洲第一久久影院|