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

洛譯小筑

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

[ECPP讀書筆記 條目22] 將數(shù)據(jù)成員聲明為私有的

好吧,以下是我們的計(jì)劃:我們首先要分析為什么數(shù)據(jù)成員不應(yīng)該是公有的,然后繼續(xù)分析為什么數(shù)據(jù)成員也不能是protected的。然后就引出本條款的結(jié)論:數(shù)據(jù)成員必須是私有的。結(jié)論引出,計(jì)劃完成。

那么,數(shù)據(jù)成員為什么不能是public的?

讓我們從討論語義一致性問題開始(另請參見條目18)。如果數(shù)據(jù)成員不是公有的,那么客戶要想訪問對象就只剩下成員函數(shù)一種方法。如果公有接口中所有的東西都是函數(shù),那么客戶在期望訪問類成員時,由于一切都是函數(shù),所以就可以任意使用,而不用擔(dān)心是否需要使用括號。在整個過程中,這樣做可以讓你節(jié)省大量躊躇不定的時間。

但是也許你會發(fā)現(xiàn),并沒有強(qiáng)制規(guī)定來要求語義的一致性。那么你是否會發(fā)現(xiàn):使用函數(shù)可以讓你更精確地控制數(shù)據(jù)成員的訪問權(quán)?如果把一個數(shù)據(jù)成員定義為public的,那么每個人對其都擁有“可讀可寫”的訪問權(quán),但是如果你使用函數(shù)來為數(shù)據(jù)成員賦值,或者獲取數(shù)據(jù)成員的值,那么你可以將其實(shí)現(xiàn)為“禁止訪問”、“只讀”以及“可讀可寫”幾種級別的訪問權(quán);嘿,如果需要,你甚至可以將其實(shí)現(xiàn)為“只寫”的訪問權(quán):

class AccessLevels {

public:

  ...

  int getReadOnly() const    { return readOnly; }

  void setReadWrite(int value) { readWrite = value; }

  int getReadWrite() const   { return readWrite; }

  void setWriteOnly(int value) { writeOnly = value; }

 

private:

  int noAccess;               // int值禁止訪問

  int readOnly;               // int值擁有只讀級別訪問權(quán)

  int readWrite;              // int值擁有可讀可寫級別訪問權(quán)

  int writeOnly;              // int值擁有只寫級別訪問權(quán)

};

很有必要將訪問權(quán)管理得如此有條不紊,因?yàn)樵S多數(shù)據(jù)成員本應(yīng)該被隱藏起來。并不是每個數(shù)據(jù)成員都需要一個取值器(getter)和一個賦值器(setter)。

還不是十分肯定?那么現(xiàn)在是時候使出殺手锏了:“封裝”。如果你通過程序?qū)崿F(xiàn)了對一個數(shù)據(jù)成員的訪問,那么你就可以使用一次計(jì)算來代替這個數(shù)據(jù)成員,使用這一個類的人完全不會有所察覺。

請看下邊的示例,假設(shè)你正在為一種自動裝置編寫一個應(yīng)用程序,這一裝置可以監(jiān)視通過汽車的行駛速度,當(dāng)一輛汽車通過時,這一應(yīng)用程序就會計(jì)算出它的速度,然后將這一數(shù)值保存到一個小型數(shù)據(jù)庫中,其中保存著曾通過所有車輛的速度數(shù)據(jù):

class SpeedDataCollection {

  ...

public:

  void addValue(int speed);        // 添加新的數(shù)據(jù)值

 

  double averageSoFar() const;     // 返回速度的平均值

 

  ...

};

現(xiàn)在請注意成員函數(shù)averageSoFar的具體實(shí)現(xiàn)問題。一種實(shí)現(xiàn)方法是:為類添加一個數(shù)據(jù)成員,讓它保存速度的平均值,隨數(shù)據(jù)庫的改動更新這一成員的數(shù)值。當(dāng)調(diào)用averageSoFar時,它僅僅返回這一數(shù)據(jù)成員的值。另一種做法是:在每次調(diào)用averageSoFar時都計(jì)算出這一平均值,此時需要檢查數(shù)據(jù)庫中所有的數(shù)據(jù)值。

因?yàn)榈谝环N手段(保存即時更新的平均值)中,你需要為保存即時更新平均值、累計(jì)總和以及數(shù)據(jù)的個數(shù)這幾種數(shù)據(jù)成員分配空間,因此這一方法使得SpeedDataCollection對象都變得更大一些。然而,averageSoFar卻十分的高效。可以把它寫成一個內(nèi)聯(lián)函數(shù)(參見條目30),所做的僅僅是返回這一即時更新的。相反地,在需要時進(jìn)行計(jì)算,averageSoFar速度上會慢一些,但是SpeedDataCollection對象的體積更小。

二者孰優(yōu)孰劣,誰又能斷定呢?在一個內(nèi)存較為局促的機(jī)器(比如嵌入式的公路設(shè)備)上,并且該應(yīng)用程序不會頻繁的調(diào)用平均值,那么實(shí)時計(jì)算的方案就更為優(yōu)秀。相反地,在平均值需要頻繁使用,速度是程序的關(guān)鍵,內(nèi)存不是問題的情況下,則更應(yīng)采用保存一個即時平均值的方案。最重要的一點(diǎn)是,在通過成員函數(shù)訪問平均值時(也就是“封裝”),你可以交替使用這兩種實(shí)現(xiàn)方案(當(dāng)然,你可能還會想到其它重要的問題),客戶頂多要做的一件事就是重新編譯一下代碼。(即使編譯所帶來的不方便也可以排除。參見條目31中介紹的技術(shù)。)

將數(shù)據(jù)成員隱藏在函數(shù)式接口的背后可以使得任意種類的實(shí)現(xiàn)方法更加靈活多變。比如說,這樣做可以非常容易地做到下面幾件事情:在數(shù)據(jù)成員進(jìn)行讀寫操作時告知其他對象,驗(yàn)證類的恒定性和函數(shù)運(yùn)行前后的狀態(tài),在多線程系統(tǒng)下進(jìn)行同步操作,等等。如果讓DelphiC#的程序員使用C++,他們會發(fā)現(xiàn)C++這一特性與這些語言中的“屬性”很相像,只是C++中需要添加一對括號。

封裝是C++的一個博大精深的特性。如果你對客戶隱藏了數(shù)據(jù)成員的話(也就是將它們封裝起來),你就可以確保類永遠(yuǎn)保持一致性,這是因?yàn)橹挥谐蓡T函數(shù)可以影響到數(shù)據(jù)成員,同時你也保留了在以后改變具體實(shí)現(xiàn)方法的權(quán)利。如果你不將這些方法隱藏起來,那么你很快就會發(fā)現(xiàn),即使你擁有類的源代碼,對公有接口的修改也是受到嚴(yán)格限制的,因?yàn)檫@樣做會破壞許多客戶端代碼。公有就意味著未封裝,同時從實(shí)用角度講,未封裝就意味著無法更改,較為廣泛應(yīng)用的類更甚之。然而廣泛應(yīng)用的類最需要使用封裝,因?yàn)樗鼈兛梢詮?#8220;具體實(shí)現(xiàn)可以不斷改良”這一點(diǎn)上獲得最大程度的收益。

上面的分析對于protected數(shù)據(jù)成員也適用。盡管二者乍看上去有一定的區(qū)別,但實(shí)際上它們是完全一致的。在使用public數(shù)據(jù)成員時,我們分析了語意一致性問題和訪問權(quán)條理性問題,這一分析過程對于使用protected數(shù)據(jù)同樣適用。但還有一個問題——封裝。protected數(shù)據(jù)成員不是比public的更具有封裝性嗎?從實(shí)用角度講,你會得到一個令人吃驚的答案:不是。

條目23中將介紹這一問題:C++中封裝程度與代碼的健壯程度(這段代碼相關(guān)部分被修改時抵御破壞的能力)成正比。因此,數(shù)據(jù)成員的封裝程度與代碼的健壯程度也是成正比的。比如,當(dāng)一個數(shù)據(jù)成員從類中移除時(可能你期望使用一次計(jì)算來代替,就像上文中的averageSoFar一樣),代碼是否會遭到破壞,將取決于封裝程度。

請考慮這個問題:假設(shè)我們有一個public數(shù)據(jù)成員,然后我們把它刪除了,那么將有多少的代碼將遭到破壞呢?我們說,所有使用它的客戶端代碼。這將是一個無法預(yù)知的巨大數(shù)字。公有數(shù)據(jù)成員就是這樣完全沒有封裝性的。但是繼續(xù)考慮:我們有一個protected數(shù)據(jù)成員,然后我們把它刪除了,此時將破壞多少代碼?我們說,所有使用它的派生類,這同樣是一個無法預(yù)知的巨大數(shù)字。由于在這兩種情況下,如果數(shù)據(jù)成員被更改了,那么將會為客戶帶來無法估量的損失,因此可以說protected數(shù)據(jù)成員與public的一樣沒有封裝性。這是違背直覺的,但是有經(jīng)驗(yàn)的庫實(shí)現(xiàn)者會告訴你,這是千真萬確的。一旦你聲明了一個publicprotected的數(shù)據(jù)成員,然后客戶開始使用它,你就很難再對這一數(shù)據(jù)成員做出修改。因?yàn)檫@樣做會帶來太多的代碼重寫、重新測試重新編寫文檔和重新編譯等等工作。按封裝的理念來說,對于數(shù)據(jù)成員僅僅存在兩個層次的訪問權(quán),那就是:private(可以提供封裝性)和非private(不提供封裝性)。

時刻牢記

要將數(shù)據(jù)成員聲明為私有的。這樣可以讓客戶端訪問數(shù)據(jù)時擁有一致的語義,提供有序的訪問控制,強(qiáng)制類保持一致性,為類作者提供更高的靈活性。

protected并不會帶來比public更高的封裝性。

posted on 2007-06-06 18:37 ★ROY★ 閱讀(1036) 評論(0)  編輯 收藏 引用 所屬分類: Effective C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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成人激情| 99精品久久久| 在线亚洲一区| 欧美一区二区福利在线| 国产色产综合产在线视频| 欧美精品久久一区二区| 久久精品视频在线免费观看| 亚洲伦伦在线| 91久久精品国产| 欧美专区一区二区三区| 99riav国产精品| 亚洲第一级黄色片| 伊人精品成人久久综合软件| 国产精品一区在线播放| 欧美日韩一区二区免费视频| 欧美国产亚洲视频| 欧美精品亚洲一区二区在线播放| 免费一区视频| 久久久久www| 欧美一级黄色网| 欧美在线91| 久久久久国产精品人| 欧美自拍偷拍午夜视频| 久久精品夜色噜噜亚洲a∨| 欧美一站二站| 久久久久亚洲综合| 欧美高清在线一区二区| 亚洲精品乱码久久久久久黑人| 久久综合精品一区| 欧美日韩国产色视频| 国产综合激情| 9色精品在线| 久久久91精品国产一区二区精品| 麻豆成人91精品二区三区| 亚洲黄一区二区| 欧美一区二区三区精品| 亚洲一区中文| 激情另类综合| 亚洲人成小说网站色在线| 国产欧美日本一区视频| 欧美激情视频网站| 久久综合国产精品台湾中文娱乐网| 亚洲国产欧美另类丝袜| 欧美亚洲一区| 久久国内精品自在自线400部| 欧美中文在线视频| 免费欧美网站| 在线视频免费在线观看一区二区| 日韩一级免费观看| 亚洲欧美日韩天堂| 欧美超级免费视 在线| 欧美视频在线观看视频极品| 国产亚洲综合精品| 一区二区三区精品视频| 亚洲综合另类| 久久一日本道色综合久久| 亚洲精品视频在线观看免费| 午夜精品网站| 欧美日韩日日骚| 一区在线视频观看| 亚洲影视在线播放| 另类酷文…触手系列精品集v1小说| 欧美国产精品一区| 久久国产欧美日韩精品| 欧美性猛片xxxx免费看久爱| 亚洲国产精品毛片| 久久久国产精品一区二区中文| 亚洲欧洲精品一区二区三区| 午夜老司机精品| 欧美精品www| 性欧美长视频| 国产精品成人免费精品自在线观看| 在线欧美影院| 女同一区二区| 午夜精品亚洲一区二区三区嫩草| 久久久久久久久一区二区| 国产精品久久久久久久久久直播 | 伊人春色精品| 久久精品亚洲一区| 午夜一区二区三视频在线观看| 欧美日韩在线观看一区二区三区| 亚洲精品影院| 亚洲精品乱码久久久久久黑人 | 国产精品国产三级国产普通话99 | 日韩视频在线播放| 亚洲精品国产精品国自产在线 | 在线午夜精品自拍| 国产精品久久久久免费a∨| 9久re热视频在线精品| 亚洲精品美女久久7777777| 国产精品麻豆成人av电影艾秋| 亚洲欧美bt| 性久久久久久久| 亚洲精品小视频| 午夜日韩在线观看| 亚洲欧洲精品一区二区三区不卡 | 欧美国产日韩一区二区| 亚洲永久免费| 欧美一区中文字幕| 亚洲娇小video精品| 日韩午夜在线电影| 国产一区二区三区四区| 91久久精品国产| 国产精品丝袜久久久久久app| 久久久精品网| 欧美伦理在线观看| 久久国产一区| 欧美成人激情视频| 久久精品成人一区二区三区 | 你懂的国产精品| 欧美午夜精品久久久久久超碰| 久久九九久精品国产免费直播| 久久一区视频| 亚洲欧美激情视频| 女生裸体视频一区二区三区| 亚洲性视频网址| 久久综合福利| 欧美在线日韩| 欧美日韩人人澡狠狠躁视频| 老司机精品导航| 国产精品成人v| 亚洲第一伊人| 悠悠资源网亚洲青| 午夜精品久久久久久99热| 中日韩美女免费视频网站在线观看| 亚洲一区二区免费视频| 久久国产精品高清| 91久久精品网| 国产精品视频区| 欧美日韩午夜在线| 欧美国产一区二区| 久久精品日韩欧美| 久久综合狠狠综合久久综合88| 久久aⅴ乱码一区二区三区| 欧美激情综合| 老司机精品视频网站| 亚洲欧美激情四射在线日 | 欧美不卡高清| 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美一区二区精品仙草咪 | 亚洲视频在线一区| 欧美一区三区三区高中清蜜桃| 亚洲国产裸拍裸体视频在线观看乱了 | 国产欧美在线观看一区| 欧美一区二区三区喷汁尤物| 久久综合给合久久狠狠狠97色69| 亚洲视频在线视频| 亚洲欧美日韩一区二区在线 | 亚洲视频在线一区观看| 亚洲欧美日韩精品久久| 亚洲国产成人在线| 亚洲欧美在线播放| 免费成人性网站| 国产欧美精品日韩| 日韩午夜三级在线| 亚洲看片一区| 国产精品二区二区三区| 欧美gay视频激情| 韩国一区电影| 欧美一区二区三区精品| 久久精品国产清高在天天线| 中文av一区二区| 欧美日韩你懂的| 欧美不卡在线视频| 99视频超级精品| 一区二区三区在线观看视频| 亚洲黑丝在线| 亚洲理伦电影| 亚洲一区二区三区久久| 91久久线看在观草草青青| 亚洲在线一区| 亚洲影院高清在线| 国语自产精品视频在线看抢先版结局| 亚洲精品一区在线观看| 亚洲人成小说网站色在线| 久久手机免费观看| 影院欧美亚洲| 美女久久一区| 亚洲人成在线观看网站高清| 亚洲激情电影在线| 麻豆乱码国产一区二区三区| 久久综合给合久久狠狠色 | 欧美精品免费看| 欧美黄色免费| 日韩一级精品| 夜夜夜久久久| 亚洲高清在线播放| 99精品热视频只有精品10| 欧美1区3d| 欧美伊人久久| 亚洲午夜高清视频| 国产一区白浆| 久久一区激情| 久久精品中文| 午夜宅男久久久| 在线观看欧美亚洲| 欧美国产一区二区三区激情无套|