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

洛譯小筑

別來(lái)無(wú)恙,我的老友…
隨筆 - 45, 文章 - 0, 評(píng)論 - 172, 引用 - 0
數(shù)據(jù)加載中……

[ECPP讀書筆記 條目6] 要顯式禁止編譯器為你生成不必要的函數(shù)

真實(shí)的房地產(chǎn)代理商的工作是出售房屋,而一個(gè)為房產(chǎn)代理商提供支持的軟件系統(tǒng)自然要用一個(gè)類來(lái)代表要出售的房屋:

class HomeForSale { ... };

所有房地產(chǎn)代理商能夠很輕松的指出,每套房產(chǎn)都是獨(dú)一無(wú)二的——沒有兩套是完全一樣的。既然如此,為一個(gè)HomeForSale對(duì)象復(fù)制出一個(gè)副本的想法就顯得沒什么意義了。你怎么能夠復(fù)制那些生來(lái)就獨(dú)一無(wú)二的東西呢?如果你嘗試去復(fù)制一個(gè)HomeForSale對(duì)象,那么編譯器則不應(yīng)該接受:

HomeForSale h1;

HomeForSale h2;

 

HomeForSale h3(h1);                // 嘗試復(fù)制h1:不應(yīng)通過編譯!

h1 = h2;                           // 嘗試復(fù)制h2:不應(yīng)通過編譯!

可惜的是,防止這種復(fù)雜問題發(fā)生的方法并不是那么直截了當(dāng)。通常情況下,如果你希望一個(gè)類不支持某種特定的功能,你需要做的僅僅是不去聲明那個(gè)函數(shù)。然而這一策略對(duì)復(fù)制構(gòu)造函數(shù)和拷貝賦值運(yùn)算符就失效了,這是因?yàn)椋词鼓悴蛔雎暶鳎坏┯腥藝L試調(diào)用這些函數(shù),編譯器就會(huì)為你自動(dòng)聲明它們(參見條目5)。

這會(huì)使你便陷入困境。如果你不聲明一個(gè)復(fù)制構(gòu)造函數(shù)或者賦值運(yùn)算符,編譯器可能就會(huì)幫你去做,你的類就會(huì)支持對(duì)象復(fù)制。從另一個(gè)角度說(shuō),如果你確實(shí)聲明了這些函數(shù),你的類仍然支持復(fù)制。但是現(xiàn)在的目標(biāo)是防止復(fù)制!

解決問題的關(guān)鍵是,所有編譯器生成的函數(shù)都是公共的。為了防止編譯器生成這些函數(shù),你必須自己聲明,但是現(xiàn)在沒有什么要求你將這些函數(shù)聲明為公共的。取而代之,你應(yīng)該將復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符聲明為私有的。通過顯式聲明一個(gè)函數(shù),你就可以防止編譯器去自動(dòng)生成這個(gè)函數(shù),同時(shí),通過將函數(shù)聲明為private的,你便可以防止人們?nèi)フ{(diào)用它。

差不多了。但是這一方案也沒有那么傻瓜化,這是因?yàn)槌蓡T函數(shù)和友元函數(shù)仍然可以調(diào)用你的私有函數(shù)。除非你足夠的聰明,沒有去定義這些成員或友元。如果一些人由于疏忽大意而調(diào)用了其中的任意一個(gè),他們會(huì)在程序連接時(shí)遇到一個(gè)錯(cuò)誤。把成員函數(shù)聲明為private的但是不去實(shí)現(xiàn)它們,這一竅門已經(jīng)成為編程常規(guī),在C++的I/O流的庫(kù)中的一些類,都會(huì)采用這種方法來(lái)防止復(fù)制。比如,你可以參考標(biāo)準(zhǔn)庫(kù)中ios_basebasic_iossentry的實(shí)現(xiàn)。你會(huì)發(fā)現(xiàn)在各種情況下,復(fù)制構(gòu)造函數(shù)和拷貝賦值運(yùn)算符都聲明為private而且沒有得到定義。

對(duì)HomeForSale使用這一技巧十分簡(jiǎn)單:

class HomeForSale {

public:

  ...

private:

  ...

  HomeForSale(const HomeForSale&); // 只有聲明

  HomeForSale& operator=(const HomeForSale&);

};

你會(huì)發(fā)現(xiàn)我省略了函數(shù)參數(shù)的名稱。這樣做并不是必需的,這僅僅是一個(gè)普通慣例。畢竟這些代碼不會(huì)得到實(shí)現(xiàn),而且很少會(huì)用到,那么給這些參數(shù)命名又有什么用呢?

通過上文中類的聲明,編譯器會(huì)防止客戶嘗試復(fù)制HomeForSale對(duì)象,如果你不小心在成員函數(shù)或者友元函數(shù)中這樣做了,那么你的程序?qū)o(wú)法得到連接。

如果你將復(fù)制構(gòu)造函數(shù)和拷貝賦值運(yùn)算符聲明為private的,并且將二者移出HomeForSale的內(nèi)部,放置在一個(gè)專門設(shè)計(jì)用來(lái)防止復(fù)制的基類中,那么在編譯時(shí)就排除這些原本是連接時(shí)的錯(cuò)誤便成為可能(這是件好事——早期發(fā)現(xiàn)錯(cuò)誤要比晚些更理想)。這一基類極其簡(jiǎn)單:

class Uncopyable {

protected:                         // 允許派生類存在構(gòu)造函數(shù)和析構(gòu)函數(shù)

  Uncopyable() {}

  ~Uncopyable() {}

 

private:

  Uncopyable(const Uncopyable&);   // 但禁止復(fù)制

  Uncopyable& operator=(const Uncopyable&);

};

為了防止HomeForSale對(duì)象被復(fù)制,我們所需要做的僅僅是讓其繼承Uncopyable

class HomeForSale: private Uncopyable {

  ...                              // 這一類不再聲明復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符

};

這樣做是可行的,這是因?yàn)槿绻腥耍ㄉ踔潦且粋€(gè)成員或友元函數(shù))嘗試復(fù)制一個(gè)HomeForSale對(duì)象,編譯器將會(huì)嘗試自動(dòng)生成一個(gè)復(fù)制構(gòu)造函數(shù)和一個(gè)拷貝賦值運(yùn)算符。就像條目12中所解釋的,這些函數(shù)由編譯器自動(dòng)生成的版本會(huì)嘗試調(diào)用它們基類中的這一部分,顯然這些調(diào)用只能吃到閉門羹,這是因?yàn)閺?fù)制操作在基類中是私有的。

Uncopyable的實(shí)現(xiàn)和應(yīng)用存在一些微妙的問題,諸如繼承自Uncopyable的類不一定必須為public的(參見條目32和條目39),Uncopyable的析構(gòu)函數(shù)不一定必須為虛函數(shù)(參見條目7)。由于Uncopyable不包含任何數(shù)據(jù),它適合作為空基類優(yōu)化方案(參見條目39),但是由于它是一個(gè)基類,使用這一技術(shù)將導(dǎo)致多重繼承(參見條目40)。然而,多重繼承在某種情況下會(huì)使空基類優(yōu)化失去作用(同樣,請(qǐng)參見條目39)。總體來(lái)說(shuō),你可以忽略這些微妙的問題,僅僅使用上文中的Uncopyable,因?yàn)樗鼤?huì)像所承諾的那樣精確地完成工作。你也可以使用Boost版本(條目55)。那個(gè)類叫做noncopyable。它是一個(gè)優(yōu)秀的類,我只是發(fā)現(xiàn)它的名字顯得有些不自然(un-natural),呃,“非”自然(non-natural)。

時(shí)刻牢記

為了禁用編譯器自動(dòng)提供的功能,你必須將相關(guān)的成員函數(shù)聲明為private的,同時(shí)不要實(shí)現(xiàn)它。方法之一是:使用一個(gè)類似于Uncopyable的基類。

posted on 2007-04-18 23:21 ★ROY★ 閱讀(1069) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Effective C++

評(píng)論

# re: 【翻譯】Effective C++ (第6條:要顯式禁止編譯器為你生成不必要的函數(shù))  回復(fù)  更多評(píng)論   

// 這一類不再聲明復(fù)制構(gòu)造器和賦值運(yùn)算符。

這句話蠻重要,呵呵
2007-05-22 15:05 | recorder
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美影音先锋| 国产亚洲午夜高清国产拍精品| 乱码第一页成人| 久久亚洲一区二区| 欧美粗暴jizz性欧美20| 欧美激情第六页| 亚洲韩国日本中文字幕| 久久久国产精品一区二区三区| 久久久999精品免费| 女主播福利一区| 亚洲精品系列| 亚洲欧美日韩电影| 玖玖在线精品| 欧美日韩情趣电影| 国产欧美一区二区精品性色| 1769国产精品| 亚洲视频第一页| 久久久久国产精品一区二区| 亚洲国产精品黑人久久久| 亚洲天堂av在线免费| 久久精品首页| 欧美午夜精品久久久| 国产一区二区福利| 一区二区三区精品在线| 老司机精品视频网站| 一区二区三区 在线观看视| 久久看片网站| 国产亚洲欧美日韩美女| 亚洲精品永久免费| 欧美影院成年免费版| 亚洲黄色在线视频| 久久久久久久成人| 国产精品亚洲а∨天堂免在线| 亚洲欧洲视频在线| 麻豆国产va免费精品高清在线| 一区二区三区欧美在线观看| 另类欧美日韩国产在线| 国产一区二区三区自拍 | 免费不卡在线视频| 国产精品视频九色porn| 日韩网站免费观看| 欧美.www| 久久精品国产免费| 国产亚洲电影| 亚洲欧美日韩在线不卡| 99视频精品| 欧美成人免费一级人片100| 国产综合亚洲精品一区二| 欧美在线视频观看| 亚洲女人天堂成人av在线| 欧美亚一区二区| 在线亚洲欧美专区二区| 亚洲人成7777| 欧美成人xxx| 午夜精品久久久久久久白皮肤| 久久久精品国产免大香伊| 亚洲特色特黄| 国产精品国产三级国产专播精品人 | 一区二区欧美日韩视频| 亚洲国产精品123| 久久午夜精品| 亚洲电影成人| 欧美激情一区二区三区高清视频| 久久精品欧美| 在线精品视频一区二区| 欧美96在线丨欧| 麻豆久久婷婷| 99热在线精品观看| 99热这里只有精品8| 国产精品白丝jk黑袜喷水| 午夜精品视频一区| 久久久999国产| 亚洲啪啪91| 99热这里只有成人精品国产| 国产精品网站视频| 鲁鲁狠狠狠7777一区二区| 卡通动漫国产精品| 99在线精品视频在线观看| 亚洲视频播放| 在线观看亚洲| 一区二区三区精品在线| 国产日韩视频一区二区三区| 免播放器亚洲一区| 欧美日韩免费一区二区三区视频 | 欧美福利视频在线| 欧美护士18xxxxhd| 欧美亚洲三区| 免费观看日韩| 亚洲欧美在线免费观看| 久久精品国产999大香线蕉| 亚洲欧洲中文日韩久久av乱码| 99国产麻豆精品| 激情欧美一区| 一本一道久久综合狠狠老精东影业 | 国产午夜亚洲精品不卡| 欧美大片在线观看一区| 国产精品久久一卡二卡| 欧美a级片一区| 国产精品超碰97尤物18| 欧美成人午夜| 国产一区二区三区自拍 | 蜜臀久久99精品久久久久久9 | 欧美在线不卡| 欧美激情片在线观看| 欧美日韩情趣电影| 国产一区二区欧美| 亚洲七七久久综合桃花剧情介绍| 国产精品视频99| 亚洲精品日韩一| 黄网站免费久久| 亚洲一区二区久久| 日韩午夜电影| 久久一区亚洲| 久久久久久久综合| 国产精品福利网| 亚洲激情国产精品| 一区二区在线观看视频| 亚洲视频999| 亚洲网站视频| 欧美精品成人91久久久久久久| 老司机精品视频网站| 国产三级精品在线不卡| 亚洲在线观看视频网站| 中国av一区| 欧美极品影院| 亚洲国产精品尤物yw在线观看| 黑人巨大精品欧美黑白配亚洲| 亚洲影视在线播放| 欧美一级电影久久| 国产欧美精品在线播放| 亚洲视频在线二区| 中文成人激情娱乐网| 亚洲伦理在线免费看| 欧美成人嫩草网站| 亚洲第一成人在线| 激情欧美一区| 欧美fxxxxxx另类| 亚洲国产精品第一区二区三区| 91久久精品日日躁夜夜躁国产| 蜜臀久久久99精品久久久久久 | 黑人一区二区三区四区五区| 欧美一区二区观看视频| 久久久久久9| 亚洲电影在线免费观看| 麻豆精品在线播放| 亚洲精品一区二区三区99| 夜夜嗨av一区二区三区四区| 欧美日韩网站| 亚洲欧美综合一区| 久热精品在线| 亚洲国产精品一区二区三区| 欧美夫妇交换俱乐部在线观看| 亚洲精品久久久一区二区三区| 亚洲一区二区三区在线播放| 国产欧美一区二区三区另类精品 | 久久夜色精品国产| 亚洲国产精品嫩草影院| 亚洲一区二区三区涩| 国产精品入口麻豆原神| 久久久精品免费视频| 亚洲国产成人久久综合| 亚洲欧美一区二区原创| 一区二区三区在线免费观看| 欧美精品一区二区三区蜜臀| 亚洲中午字幕| 亚洲国产精品va| 欧美在线视频不卡| 亚洲国产成人精品久久| 欧美系列一区| 欧美国产日韩精品免费观看| 黄色成人av在线| 亚洲精品乱码久久久久久日本蜜臀| 国产精品vvv| 久久精品欧美| 亚洲精品黄网在线观看| 久久久久久一区二区| 日韩视频不卡| 国产午夜精品麻豆| 欧美日韩国产a| 久久琪琪电影院| 亚洲制服欧美中文字幕中文字幕| 欧美国产精品v| 久久精品人人做人人爽| 中国成人黄色视屏| 亚洲第一精品影视| 国产欧美一区二区精品秋霞影院 | 久久激情网站| 一区二区三区国产在线观看| 美国十次了思思久久精品导航| 亚洲午夜精品一区二区| 亚洲第一黄色| 激情亚洲网站| 国产亚洲精品美女| 国产精品yjizz| 欧美日韩亚洲一区二区三区在线观看 | 久久都是精品| 午夜精品久久久久久久久久久| 最新精品在线| 亚洲高清免费| 亚洲电影免费在线观看|