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

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>
            亚洲欧美日韩精品久久亚洲区| 久久蜜桃资源一区二区老牛| 亚洲欧美日韩视频一区| 久久久蜜桃一区二区人| 亚洲欧美一区二区精品久久久| 一区二区三区高清| 99在线|亚洲一区二区| 一本久久综合| 亚洲欧美在线视频观看| 午夜精品国产更新| 久久久久久色| 欧美日本精品| 国产精品一区二区在线| 国产欧美一区二区三区在线老狼| 国产尤物精品| 亚洲久久一区二区| 久久se精品一区精品二区| 欧美+日本+国产+在线a∨观看| 欧美福利小视频| 一本色道久久综合狠狠躁的推荐| 午夜久久久久| 欧美久久久久久久| 韩国三级在线一区| 夜夜嗨av一区二区三区四区| 午夜一区在线| 亚洲国产精品123| 欧美高清视频一区二区| 亚洲精品视频在线观看网站| 午夜免费日韩视频| 欧美日本国产在线| 亚洲国产免费看| 亚洲欧美日韩国产一区二区| 毛片av中文字幕一区二区| aⅴ色国产欧美| 玖玖综合伊人| 国产一区在线免费观看| 亚洲一区二区不卡免费| 欧美顶级少妇做爰| 性做久久久久久免费观看欧美| 欧美劲爆第一页| 影音先锋中文字幕一区二区| 午夜视频精品| 亚洲人成啪啪网站| 美女网站久久| 国产亚洲欧洲| 香蕉久久一区二区不卡无毒影院 | 欧美日韩国产一中文字不卡 | 久久视频在线看| 国产精品午夜春色av| 99精品视频免费观看| 久久精品亚洲精品| 亚洲网站在线| 欧美日韩免费观看一区二区三区 | 在线观看日韩一区| 国产一区自拍视频| 欧美日韩亚洲一区二区三区在线| 在线不卡a资源高清| 欧美在线影院在线视频| 国产精品99久久久久久久vr| 欧美日韩国产色视频| 91久久精品一区| 欧美高清自拍一区| 美女主播一区| 亚洲精品乱码久久久久久久久 | 女仆av观看一区| 久久99伊人| 国外成人在线| 老司机免费视频一区二区| 欧美一区二区三区在线免费观看| 国产精品免费久久久久久| 亚洲在线视频观看| 亚洲一区二区三区在线| 国产精品自拍在线| 久久久综合网站| 六月丁香综合| 99热这里只有成人精品国产| 亚洲全黄一级网站| 国产精品jvid在线观看蜜臀| 午夜在线播放视频欧美| 午夜一区在线| 亚洲第一中文字幕在线观看| 亚洲福利视频一区| 欧美日韩国产在线看| 亚洲一区二区精品在线观看| 亚洲夜晚福利在线观看| 国产一二精品视频| 欧美风情在线观看| 国产精品剧情在线亚洲| 久久久久综合一区二区三区| 久久亚洲风情| 亚洲一区二区三区乱码aⅴ| 亚洲制服丝袜在线| 在线成人欧美| 在线亚洲一区| 在线观看成人网| 亚洲人成啪啪网站| 狠狠色狠狠色综合| 亚洲激情一区二区| 国产日韩欧美亚洲一区| 亚洲福利在线视频| 国产亚洲人成a一在线v站| 欧美激情1区2区3区| 国产精品久久久999| 欧美jjzz| 国产精品久久久对白| 欧美不卡高清| 国产麻豆精品久久一二三| 欧美大片一区二区| 国产欧美视频在线观看| 亚洲国产老妈| 国产在线一区二区三区四区| 亚洲伦理自拍| 亚洲片在线资源| 亚洲欧美视频一区| 欧美大学生性色视频| 国产精品久久久久久超碰| 亚洲大胆人体视频| 国产一区二区0| 亚洲午夜三级在线| 亚洲精品综合久久中文字幕| 欧美一区二区高清在线观看| 一二三四社区欧美黄| 久久久久久亚洲精品杨幂换脸| 亚洲视频专区在线| 欧美大片第1页| 男人的天堂亚洲在线| 国产日韩精品一区二区三区在线| 99国内精品| 亚洲精选成人| 欧美韩国一区| 欧美成人午夜影院| 精品999在线播放| 午夜精品久久久久久久99热浪潮 | 在线视频你懂得一区| 毛片av中文字幕一区二区| 久久精品最新地址| 国产日韩精品一区| 亚洲欧美国产精品专区久久| 亚洲女女女同性video| 欧美视频一区二区三区| 亚洲日本中文字幕区| 亚洲国产精品一区二区www在线 | 亚洲影音一区| 亚洲欧美影音先锋| 国产人成精品一区二区三| 亚洲影视中文字幕| 欧美在线观看一二区| 国产日韩欧美一二三区| 欧美一区二区成人| 免费亚洲一区二区| 亚洲三级影院| 欧美日韩日日夜夜| 亚洲午夜影视影院在线观看| 亚洲男同1069视频| 国产欧美婷婷中文| 久久av红桃一区二区小说| 久久久视频精品| 一区免费在线| 欧美激情一区二区三区四区| 9色国产精品| 久久人人爽人人爽| 亚洲国产综合视频在线观看| 欧美成人综合网站| 夜夜精品视频一区二区| 欧美与黑人午夜性猛交久久久| 国内精品美女在线观看| 麻豆精品视频在线观看| 亚洲精品色婷婷福利天堂| 午夜精品视频一区| 有码中文亚洲精品| 欧美高清免费| 亚洲一级高清| 欧美二区在线| 欧美一级视频一区二区| 亚洲福利小视频| 欧美先锋影音| 久久女同精品一区二区| 亚洲国产精品欧美一二99| 欧美一级视频| 亚洲国产91| 欧美一区2区三区4区公司二百| 国产夜色精品一区二区av| 欧美乱人伦中文字幕在线| 性久久久久久久久久久久| 亚洲国产成人porn| 久久大综合网| 一本大道久久a久久精品综合| 国产亚洲aⅴaaaaaa毛片| 欧美区在线播放| 久久久欧美精品| 亚洲图片激情小说| 欧美激情一区二区三区| 午夜精品一区二区三区在线视 | 99pao成人国产永久免费视频| 久久精品亚洲| 亚洲欧美精品suv| 日韩视频一区二区在线观看 | 黄色成人在线网站| 国产伦精品一区二区三区照片91| 欧美激情中文字幕在线|