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

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 )。總體來說,你可以忽略這些微妙的問題,僅僅使用上文中的 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>
            aa成人免费视频| 欧美一区二区高清| 亚洲高清成人| 免费看的黄色欧美网站| 亚洲激情社区| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一区二区免费视频| 亚洲专区在线| 国产一区二区高清| 欧美jizz19性欧美| 欧美激情国产日韩精品一区18| 亚洲精品一区二区三区不| 91久久亚洲| 国产九九精品| 欧美成人自拍视频| 欧美精品一区二区精品网| 亚洲视频在线观看三级| 亚洲欧美文学| 亚洲第一狼人社区| 亚洲作爱视频| 国内精品一区二区| 亚洲国产精品女人久久久| 欧美精品色一区二区三区| 亚洲欧美日韩一区二区| 久久久99精品免费观看不卡| 亚洲美女在线视频| 亚洲欧美日韩在线高清直播| 国语自产精品视频在线看一大j8 | 亚洲精品日韩欧美| 国产手机视频一区二区| 欧美激情精品久久久久久久变态 | 香蕉久久精品日日躁夜夜躁| 亚洲国产成人不卡| 在线亚洲一区| 亚洲国产成人高清精品| 99在线精品观看| 伊人蜜桃色噜噜激情综合| 亚洲精品人人| 精东粉嫩av免费一区二区三区| 91久久精品美女| 国产偷自视频区视频一区二区| 最新日韩在线视频| 国产一区在线播放| 99亚洲精品| 亚洲精品1234| 欧美一区激情| 亚洲无吗在线| 你懂的网址国产 欧美| 欧美在线视频播放| 欧美日韩亚洲综合| 亚洲国产91色在线| 伊人夜夜躁av伊人久久| 亚洲欧美日韩区| 一区二区免费看| 欧美福利视频在线观看| 卡通动漫国产精品| 国产午夜亚洲精品理论片色戒| 亚洲理伦在线| 日韩亚洲一区二区| 欧美精品久久久久a| 欧美成人在线免费视频| 国产在线拍揄自揄视频不卡99| 亚洲午夜精品一区二区三区他趣| 99国产精品久久久久久久成人热| 巨胸喷奶水www久久久免费动漫| 久久久蜜桃精品| 国产一区二区高清视频| 欧美一区二区三区日韩| 久久动漫亚洲| 红桃视频亚洲| 久久久午夜视频| 麻豆乱码国产一区二区三区| 国外视频精品毛片| 久久先锋影音av| 欧美韩日亚洲| 亚洲麻豆视频| 欧美日韩免费一区二区三区视频 | 欧美一级二区| 国产日韩一区二区三区在线播放| 亚洲欧美999| 欧美伊久线香蕉线新在线| 国产日韩视频| 久久一区二区三区av| 免费观看成人| 99这里只有久久精品视频| 欧美久久成人| 中文欧美日韩| 久久久久综合| 亚洲精选在线观看| 国产精品porn| 欧美专区第一页| 亚洲高清在线播放| 亚洲午夜精品17c| 国产三级精品三级| 乱人伦精品视频在线观看| 亚洲人成7777| 性久久久久久久久久久久| 伊人久久婷婷| 欧美日韩国产一区| 欧美一级片在线播放| 亚洲第一二三四五区| 亚洲影院在线| 亚洲成色www久久网站| 欧美日韩综合精品| 欧美一级免费视频| 亚洲日韩视频| 久久久久久久久久久久久久一区 | 国产亚洲美州欧州综合国| 女仆av观看一区| 午夜精品999| 亚洲欧洲一区二区三区| 久久成人人人人精品欧| 亚洲高清免费| 国产手机视频一区二区| 欧美精品三级日韩久久| 久久国产精品久久w女人spa| 日韩视频亚洲视频| 欧美成人免费全部| 久久福利影视| 亚洲亚洲精品三区日韩精品在线视频 | 中文日韩电影网站| 欧美激情一区二区三级高清视频| 欧美一区免费视频| av成人免费观看| 亚洲国产成人久久| 国产一区二区三区奇米久涩| 欧美四级电影网站| 免费在线日韩av| 久久久精品午夜少妇| 亚洲一区中文| 在线一区二区三区四区| 亚洲国产精品悠悠久久琪琪| 久久美女性网| 欧美一区久久| 欧美一级视频一区二区| 亚洲视频你懂的| 一本久久青青| 日韩视频免费观看| 99成人在线| 夜夜狂射影院欧美极品| 亚洲国产精品一区制服丝袜| 狠狠色狠色综合曰曰| 国产欧美日韩在线观看| 国产精品入口66mio| 欧美视频日韩视频| 国产精品v欧美精品∨日韩| 欧美日韩国产一中文字不卡| 欧美好骚综合网| 欧美电影资源| 欧美大成色www永久网站婷| 免费成人av在线| 久久一二三国产| 久久综合九色欧美综合狠狠| 久久人人97超碰精品888| 老**午夜毛片一区二区三区| 久久综合电影一区| 欧美大尺度在线观看| 欧美另类在线播放| 国产精品99免费看| 国产精品一区视频| 国产在线国偷精品产拍免费yy| 激情国产一区二区| 亚洲青色在线| 亚洲淫片在线视频| 久久精品国产77777蜜臀| 久久人人97超碰精品888| 欧美成人免费观看| 亚洲精品一区久久久久久| 亚洲一区精彩视频| 久久久久久久国产| 欧美日本中文字幕| 国产欧美日韩亚洲精品| 亚洲大胆女人| 中日韩在线视频| 久久99伊人| 亚洲激情视频在线播放| 一区二区免费看| 欧美一区二区三区精品电影| 麻豆精品精华液| 国产精品福利在线观看| 尤物在线观看一区| 亚洲深夜激情| 免费成人激情视频| 一区二区精品| 麻豆国产精品一区二区三区| 欧美日韩亚洲视频| 伊人久久综合| 亚洲综合色噜噜狠狠| 美女成人午夜| 亚洲欧美国产另类| 欧美成人亚洲成人| 国产精品视频免费在线观看| 亚洲黄页一区| 久久精品视频免费播放| 亚洲美女91| 久热国产精品| 国产夜色精品一区二区av| 亚洲免费精品| 欧美成人免费大片| 欧美一区二视频|