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

Shuffy

不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19
[轉]http://m.shnenglu.com/tiandejian/archive/2007/04/18/ECPP_06.html

第6條:         要顯式禁止編譯器為你生成不必要的函數

房地產代理商的工作是出售房屋,而一個為這類代理商提供支持的軟件系統自然要用一個類來代表要出售的房屋:

class HomeForSale { ... };

就像每一個房地產代理商能夠很快指出的,每一間住宅都是獨一無二的——沒有兩間是完全一樣的。既然如此,為一個 HomeForSale 對象復制出一個副本的想法就顯得沒什么意義了。你怎么能夠復制那些生來就獨一無二的東西呢?如果你嘗試去復制一個 HomeForSale 對象,那么編譯器則不應該接受:

HomeForSale h1;

HomeForSale h2;

 

HomeForSale h3(h1);            // 嘗試復制 h1 :不應通過編譯!

h1 = h2;                       // 嘗試復制 h2 :不應通過編譯!

可惜的是,防止這種復雜問題發生的方法并不是那么的直截了當。通常情況下,如果你希望一個類不支持某種特定種類的功能,你需要做的僅僅是不去聲明那個函數。這一策略對復制構造器和賦值運算符就失靈了,這是因為,即使你不做聲明工作,而有人嘗試調用這些函數,編譯器就會為你自動聲明它們。

這會使你便陷入困境。如果你不聲明一個復制構造器或者賦值運算符,編譯器可能就會幫你去做,你的類就會支持對象復制。從另一個角度說,如果你確實聲明了這些函數,你的類仍然支持復制。但是現在的目標是防止復制!

解決問題的關鍵是,所有編譯器生成的函數都是公共的。為了防止編譯器生成這些函數,你必須自己聲明,但是現在沒有什么要求將這些函數聲明為公共的。取而代之,你應該將復制構造器和賦值運算符聲明為私有的。通過顯式聲明一個函數,你就可以防止編譯器去自動生成這個函數,并且,通過將函數聲明為 private 的,你便可以防止人們去調用它。

在大多數情況下,這一方案并不是十分簡單明了,這是因為數據成員和友元函數仍然可以調用你的私有函數。除非,你足夠的聰明,沒有去定義這些函數。如果一些人由于疏忽大意而調用了其中的任一個,他們會在連接時遇到一個錯誤。把成員函數聲明為 private 的但是不去實現它們,這一竅門已經成為編程常規,它應用于多個 C++ I/O 流的庫中,用以防止復制。比如,你可以參考標準庫中 ios_base 、 basic_ios sentry 的實現。你會發現在各種情況下,復制構造器和賦值運算符都聲明為 private 而且沒有得到定義。

HomeForSale 使用這一技巧十分簡單:

class HomeForSale {

public:

 ...

private:

 ...

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

 HomeForSale& operator=(const HomeForSale&);

};

你會發現我省略了函數參數的名稱。這樣做并不是必需的,這僅僅是一個很普通的慣例。畢竟這些代碼不會得到實現,而且很少會用到,那么給定參數名優有什么用呢?

通過上文中類的聲明,編譯器會防止客戶端程序員嘗試復制 HomeForSale 對象,如果你不小心在成員函數或者友元函數中這樣做了,那么你的程序將無法得到連接。

如果你將復制構造器和賦值運算符聲明為 private 的,并且位于 HomeForSale 的外部,放置在一個專門設計用來防止復制的基類中,那么在編譯時就排出這些連接時錯誤便成為可能(這是件好事——早期發現錯誤要比晚些更理想)。這一基類極其簡單:

class Uncopyable {

protected:                            // 允許派生類存在構造器和析構器

 Uncopyable() {}

 ~Uncopyable() {}

 

private:

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

 Uncopyable& operator=(const Uncopyable&);

};

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

class HomeForSale: private Uncopyable {

   ...                  // 這一類不再聲明復制構造器和賦值運算符。

};

這樣做是可行的,這是因為如果有人(甚至是一個成員或友元函數)嘗試復制一個 HomeForSale 對象,編譯器將會嘗試自動生成一個復制構造器和一個賦值運算符。就像 12 中所解釋的,這些函數由編譯器自動生成的版本會嘗試調用它們基類中的這一部分,顯然這些調用只能吃到閉門羹,這是因為復制操作在基類中是私有的。

Uncopyable 的實現和應用,以及一些微妙的問題,諸如繼承自 Uncopyable 的類不一定必須為 public 的(參見第 32 和第 39 條), Uncopyable 的析構器不一定必須為虛函數(參見 7 )。由于 Uncopyable 不包含任何數據,它有資格作為空基類優化方案(參見第 39 條),但是由于它是一個基類,使用這一技術將導致多重繼承(參見第 40 條)。然而,多重繼承在某種情況下會使空基類優化失去作用(同樣,請參見 39 )??傮w來說,你可以忽略這些微妙的問題,僅僅使用上文中的 Uncopyable ,因為它會像所承諾的那樣精確地完成工作。你也可以使用它的 Boost 版本(參見 55 )。那個類叫做 noncopyable 。它是一個優秀的類,我只是發現它的名字顯得有些不( un )自然,呃,“非”( non )自然。

需要記住的

為了禁用編譯器自動提供的功能,你必須將相關的成員函數聲明為 private 的,同時不要實現它。使用一個像 Uncopyable 這樣的類來完成這一工作。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品久久久久免费a∨大胸| 欧美国产精品中文字幕| 在线视频精品| 另类尿喷潮videofree| 亚洲深夜福利视频| 欧美精品一区视频| 亚洲人成亚洲人成在线观看| 久久久精品2019中文字幕神马| 亚洲黄一区二区三区| 亚洲影院免费观看| 国产精品国产三级国产aⅴ9色| 亚洲黑丝在线| 亚洲第一二三四五区| 久色婷婷小香蕉久久| 国产主播精品| 老色批av在线精品| 久久亚洲国产精品一区二区| 国产午夜精品一区二区三区欧美| 99精品热视频| 欧美日韩免费观看一区三区| 一本久久综合| 久久9热精品视频| 欧美主播一区二区三区美女 久久精品人| 一本色道婷婷久久欧美| 亚洲欧美日韩系列| 99re成人精品视频| 国产麻豆成人精品| 欧美成人精品不卡视频在线观看| 99国内精品久久| 欧美国产精品| 亚洲影院在线| 欧美亚洲一区二区三区| 亚洲国产精品嫩草影院| 免费中文日韩| 日韩一级免费观看| 一本色道88久久加勒比精品 | 欧美亚洲综合网| 免费看黄裸体一级大秀欧美| 欧美有码视频| 精品成人一区二区| 亚洲国产精品ⅴa在线观看| 欧美久久久久久久久| 亚洲影视在线| 欧美专区第一页| 日韩视频在线观看一区二区| 亚洲一区二区免费看| 国语对白精品一区二区| 亚洲欧洲美洲综合色网| 国产美女一区二区| 亚洲第一色在线| 国产精品自在线| 91久久精品国产| 国产一区二区在线观看免费播放 | 亚洲一区免费| 新片速递亚洲合集欧美合集| 亚洲国产mv| 亚洲一区日韩在线| 91久久夜色精品国产网站| 亚洲男人的天堂在线| 亚洲日韩欧美视频一区| 欧美专区18| 欧美一级理论片| 欧美激情第一页xxx| 午夜国产欧美理论在线播放| 男人的天堂亚洲| 欧美一区二区三区久久精品| 欧美激情麻豆| 欧美成人免费全部| 国产欧美一区二区精品忘忧草| 欧美韩日视频| 国产真实乱子伦精品视频| 在线综合亚洲| 在线一区日本视频| 欧美成人一区二区三区在线观看| 99热这里只有精品8| 亚洲精品亚洲人成人网| 午夜久久黄色| 午夜久久资源| 欧美日韩在线第一页| 欧美激情网站在线观看| 亚洲国产91| 快射av在线播放一区| 久久伊人精品天天| 国产一区二区三区四区五区美女| 亚洲日本激情| 一本大道久久a久久综合婷婷| 久久久精品日韩| 久久久久久久综合色一本| 国产精品综合久久久| 亚洲综合精品| 性做久久久久久免费观看欧美| 欧美成人情趣视频| 欧美黄色片免费观看| 亚洲国产日韩欧美综合久久| 久久久一二三| 欧美华人在线视频| 日韩视频免费看| 欧美精品一区二| 亚洲免费观看高清完整版在线观看熊| 国产一区二区视频在线观看| 欧美在线资源| 欧美成人高清视频| 日韩一级大片| 国产精品女人网站| 欧美在线在线| 亚洲欧洲精品成人久久奇米网| 精久久久久久久久久久| 美女精品在线观看| 亚洲精品一区二区三区婷婷月 | 美女主播视频一区| 午夜精品福利一区二区蜜股av| 亚洲一区二区四区| 国产日韩av一区二区| 久久久久久久久久看片| 亚洲高清资源综合久久精品| 亚洲无毛电影| 精品成人在线视频| 欧美日韩在线另类| 欧美资源在线| 亚洲精品在线免费| 久久久精品久久久久| 亚洲激情国产| 国产伦精品一区二区三区| 久久天天综合| 一区二区欧美在线观看| 久久免费视频一区| av不卡在线| 国产一区二区欧美日韩| 欧美高清视频一二三区| 亚洲影视在线播放| 最新日韩欧美| 狼狼综合久久久久综合网 | 亚洲国产成人在线| 亚洲欧美视频| 亚洲欧洲精品一区| 国产精品美女一区二区在线观看 | 国产小视频国产精品| 欧美高清hd18日本| 欧美中文在线视频| 日韩亚洲欧美成人一区| 久久亚洲美女| 欧美日韩国产一级片| 亚洲男人第一网站| 欧美在线观看视频| 嫩草伊人久久精品少妇av杨幂| 欧美一区二区三区播放老司机| 久久婷婷国产综合国色天香 | 美女诱惑一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 免费不卡在线观看av| 欧美一区二区三区免费大片| 一区二区三区久久网| 亚洲电影中文字幕| 国产在线观看一区| 国产精品v欧美精品v日本精品动漫 | 亚洲视频你懂的| 欧美三日本三级三级在线播放| 一区二区三区国产精品| 欧美成人午夜| 久久久99免费视频| 亚洲一区国产精品| 亚洲作爱视频| 亚洲伦理久久| 亚洲毛片在线观看| 亚洲经典三级| 在线播放亚洲一区| 狠狠网亚洲精品| 国产在线观看精品一区二区三区| 欧美日韩一区三区| 欧美精品一区二区久久婷婷| 久热综合在线亚洲精品| 欧美一区二区啪啪| 欧美在线视频网站| 欧美一区二区三区视频| 欧美伊人久久久久久久久影院| 日韩视频在线观看一区二区| 91久久线看在观草草青青| 亚洲国产日韩欧美一区二区三区| 美女视频黄a大片欧美| 久久婷婷av| 蘑菇福利视频一区播放| 男男成人高潮片免费网站| 欧美国产视频日韩| 亚洲韩国青草视频| 亚洲日韩中文字幕在线播放| 亚洲人成高清| a4yy欧美一区二区三区| 中日韩男男gay无套| 亚洲在线一区| 久久国产精品99国产精| 久热精品视频| 欧美黄色一级视频| 欧美午夜片在线观看| 国产精品丝袜91| 韩国自拍一区| 日韩亚洲不卡在线| 午夜精品电影| 免费av成人在线| 亚洲美女黄色片| 欧美亚洲综合另类|