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

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>
            亚洲三级性片| 国产精品综合av一区二区国产馆| 国产毛片一区| 欧美中文字幕在线视频| 亚洲一区尤物| 国产在线拍偷自揄拍精品| 久久精品综合| 久久久久国产一区二区三区| 在线观看亚洲专区| 亚洲日本欧美日韩高观看| 欧美精品亚洲一区二区在线播放| 夜夜爽av福利精品导航 | 亚洲欧美综合国产精品一区| 欧美成人综合一区| 欧美日韩成人网| 激情综合久久| 亚洲成人在线网| 欧美日精品一区视频| 亚洲欧美日韩国产综合在线| 久久精品视频在线播放| 国产区二精品视| 蜜桃av一区| 欧美巨乳在线| 亚洲欧美变态国产另类| 欧美永久精品| 日韩视频在线观看国产| 亚洲影视中文字幕| 亚洲成人在线| 国产精品99久久久久久白浆小说 | 久久九九国产精品| 9久re热视频在线精品| 亚洲永久精品大片| 亚洲二区在线观看| 亚洲一区二区在线观看视频| 在线日韩av片| 亚洲欧美精品在线| 99在线观看免费视频精品观看| 亚洲一区三区电影在线观看| 亚洲激情视频| 欧美一级视频精品观看| 中文在线一区| 麻豆国产精品一区二区三区| 香蕉精品999视频一区二区| 欧美国产日韩二区| 老鸭窝亚洲一区二区三区| 欧美日韩在线不卡一区| 欧美激情精品久久久久久蜜臀 | 欧美成年人视频网站| 午夜久久久久| 欧美激情中文不卡| 男女av一区三区二区色多| 欧美午夜精品一区| 亚洲精品欧美极品| 亚洲国产电影| 久久国产99| 久久xxxx精品视频| 国产精品国产精品| 一本到12不卡视频在线dvd| 亚洲日本视频| 麻豆精品一区二区综合av| 久久永久免费| 韩日欧美一区二区| 亚洲欧美在线一区| 久久精品av麻豆的观看方式 | 久久精品视频播放| 久久成人在线| 国产欧美日韩精品专区| 亚洲欧美综合一区| 欧美一级理论片| 国产精品色午夜在线观看| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 91久久精品美女| 美女999久久久精品视频| 牛牛国产精品| 亚洲黄色免费| 欧美激情四色 | 欧美成年人网| 亚洲国产精品v| 久久久久一区二区三区四区| 麻豆精品在线播放| 91久久综合亚洲鲁鲁五月天| 欧美成人自拍| 亚洲精品国产系列| 一区二区日韩欧美| 国产精品三级久久久久久电影| 亚洲女爱视频在线| 久久综合狠狠综合久久综青草| 狠色狠色综合久久| 女女同性女同一区二区三区91| 亚洲国产精品久久人人爱蜜臀| 99亚洲伊人久久精品影院红桃| 欧美日韩中文在线观看| 亚洲一区网站| 蜜臀久久久99精品久久久久久| 亚洲精品日韩激情在线电影 | 欧美一级淫片播放口| 久久伊伊香蕉| 99re6这里只有精品| 国产精品男gay被猛男狂揉视频| 午夜日韩视频| 欧美激情中文不卡| 一区二区三区日韩欧美| 国产欧美日本在线| 蜜臀久久99精品久久久久久9 | 亚洲国产91| 午夜精品久久久久久| 在线观看欧美精品| 欧美性大战久久久久| 久久精品国产一区二区三| 亚洲日韩中文字幕在线播放| 性娇小13――14欧美| 亚洲国产欧美日韩精品| 国产精品欧美风情| 免费高清在线一区| 亚洲欧美视频在线观看| 亚洲成色777777在线观看影院| 欧美亚洲一区二区在线观看| 亚洲精品女av网站| 国产丝袜一区二区三区| 欧美日韩在线播放一区| 久久在线精品| 欧美在线视频日韩| 一本色道久久综合一区| 亚洲福利视频一区| 久久免费高清视频| 亚洲欧美一区二区原创| 亚洲免费观看高清完整版在线观看| 国产亚洲一级高清| 欧美亚韩一区| 欧美日韩第一区| 裸体一区二区| 久久久精品动漫| 欧美伊人久久久久久午夜久久久久| 亚洲毛片在线观看| 亚洲黑丝在线| 欧美激情小视频| 男人的天堂成人在线| 久久久久这里只有精品| 欧美亚洲一区二区在线观看| 亚洲综合色自拍一区| 亚洲一区二区三区乱码aⅴ| 99香蕉国产精品偷在线观看| 亚洲三级影院| 亚洲国内精品在线| 亚洲黄色av| 亚洲精品你懂的| 亚洲精品久久久久中文字幕欢迎你 | 国产美女扒开尿口久久久| 欧美色中文字幕| 欧美日韩一视频区二区| 欧美视频不卡| 国产精品久久久久毛片软件| 国产精品久久综合| 国产伦精品免费视频| 国产视频在线观看一区| 国产欧美日韩视频在线观看| 国产麻豆精品久久一二三| 国产情侣一区| 在线观看欧美激情| 亚洲人成在线影院| 亚洲深夜影院| 午夜日韩激情| 久久欧美肥婆一二区| 欧美va天堂va视频va在线| 欧美大尺度在线观看| 亚洲美女免费精品视频在线观看| 日韩写真视频在线观看| 亚洲一区二区三区在线看 | 亚洲第一搞黄网站| 亚洲精品日韩在线| 亚洲综合日韩在线| 久久一区二区三区超碰国产精品| 男人的天堂亚洲在线| 欧美日韩理论| 国产日韩欧美夫妻视频在线观看| 极品少妇一区二区| 夜色激情一区二区| 久久久av毛片精品| 亚洲国产欧美一区二区三区丁香婷| 亚洲精品字幕| 香蕉久久夜色精品| 麻豆九一精品爱看视频在线观看免费| 欧美精品激情在线| 国产亚洲欧美日韩精品| 亚洲精品国产欧美| 欧美自拍偷拍午夜视频| 亚洲第一精品夜夜躁人人爽| 亚洲视频axxx| 欧美不卡三区| 国产性色一区二区| av成人毛片| 每日更新成人在线视频| 亚洲丝袜av一区| 女女同性女同一区二区三区91| 国产精品你懂得| 亚洲激情社区| 久久五月婷婷丁香社区| 亚洲图片自拍偷拍| 欧美乱大交xxxxx| 狠狠色丁香久久婷婷综合_中|