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

Shuffy

不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

【轉】http://m.shnenglu.com/tiandejian/archive/2007/06/06/ec_22.html
第22條:
   
盡量將數據成員聲明為私有的

好吧,直截了當的說,在這一條中:我們首先要分析為什么數據成員不應該是公有的,與此同時,繼續分析為什么數據成員也不能是 protected 的。然后就引出本條款的結論:數據成員必須是私有的。

那么,數據成員為什么不能 public

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

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

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 值擁有只讀級別訪問權

 int readWrite;                 // int 值擁有可讀可寫級別訪問權

 int writeOnly;                 // int 值擁有只寫級別訪問權

};

很有必要將訪問權管理得如此有條不紊,因為許多數據成員本應該被隱藏起來。并不是每個數據成員都需要一個賦值器和一個取值器。

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

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

class SpeedDataCollection {

 ...

public:

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

 

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

 

 ...

};

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

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

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

將數據成員隱藏在函數接口的背后可以使得任意種類的實現方法更加靈活多變。比如說,這樣做可以非常容易地做到下面幾件事情:提醒其它對象自己的數據成員是在被讀還是寫,驗證類的恒定性和函數運算的狀態,在多線程系統下進行同步操作,等等。如果讓 Delphi C# 的程序員使用 C++ ,他們會發現 C++ 這一特性與這些語言中的“屬性”很相像,只是 C++ 中需要一對括號。

封裝是 C++ 的一個博大精深的特性。如果你對客戶端程序員隱藏了數據成員的話(也就是將數據成員封裝起來),你就可以確保類永遠保持一致性,這是因為只有成員函數可以影響到數據成員,你保留了在以后改變具體實現方法的權利。如果你不將這些方法隱藏起來,那么你很快就會發現,即使你擁有類的源代碼,你也只能在很小的范圍內修改其中公用的部分,因為這樣做會破壞許多客戶端代碼。公用就意味著未封裝,同時從實用角度講,未封裝就意味著無法更改,較為廣泛應用的類更甚之。然而廣泛應用的類最需要使用封裝,因為它們可以從“具體實現可以不斷改良”這一點上獲得最大程度的收益。

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

23 條中將介紹這一問題: C++ 中封裝程度與代碼的健壯程度(這段代碼相關部分被修改時,抵御自身遭到破壞的能力)成正比。所以我們可以得出下面的結論:數據成員的封裝程度與代碼的健壯程度也是成正比的。代碼遭到的破壞可能是:將某個數據成員從類中移除。(可能你期望使用一次計算來代替,就像上文中的 average 一樣。)

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

銘記在心

要將數據成員聲明為私有的。這樣可以讓客戶端訪問數據時擁有一致的語義,提供有條不紊的訪問控制,強制類符合一致性,為類作者提供更高的靈活性。

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久都是精品| 久久久777| 国产婷婷色一区二区三区| 午夜精品久久久久久久99樱桃| 日韩亚洲一区在线播放| 久久综合999| 香蕉成人久久| 羞羞漫画18久久大片| 午夜精品在线| 久久婷婷久久一区二区三区| 久久综合九色综合欧美就去吻| 久久久欧美一区二区| 欧美国产精品日韩| 国产精品夜夜夜| 在线日韩av| 性久久久久久久久| 嫩草影视亚洲| av成人福利| 久久久精品999| 欧美日本韩国在线| 国产欧美短视频| 亚洲精品偷拍| 性做久久久久久久免费看| 久久久久久九九九九| 欧美激情一区二区三区高清视频| 亚洲免费观看在线观看| 欧美一区二区三区播放老司机| 免费观看国产成人| 国产精品福利影院| 国内成+人亚洲| 99亚洲精品| 欧美成人官网二区| 午夜精品亚洲| 欧美日韩伦理在线免费| 精品二区视频| 午夜精品视频在线| 亚洲国产免费| 亚洲图片欧洲图片日韩av| 久久一区二区三区av| 国产精品网站在线观看| 99热这里只有精品8| 久久综合亚洲社区| 亚洲永久在线| 国产精品成人va在线观看| 亚洲黄网站黄| 蜜桃久久精品乱码一区二区| 亚洲欧美日本日韩| 国产精品h在线观看| 99精品久久久| 最新亚洲视频| 欧美日韩精品在线播放| 亚洲精品日韩激情在线电影| 免费看黄裸体一级大秀欧美| 亚洲欧美日韩在线| 国产精品麻豆成人av电影艾秋| 99精品视频免费| 99视频精品全国免费| 欧美日本精品| 亚洲一区美女视频在线观看免费| 先锋资源久久| 一区二区三区欧美日韩| 欧美激情aⅴ一区二区三区| 久久精品国产清高在天天线| 国产性色一区二区| 久久久久久久综合| 久久超碰97人人做人人爱| 国产精品久久久久久久久婷婷 | 99av国产精品欲麻豆| 欧美国产精品v| 99热精品在线观看| 亚洲欧洲一区| 欧美午夜片在线免费观看| 亚洲欧美激情四射在线日 | 一区二区电影免费在线观看| 欧美日韩国产色视频| 亚洲一区亚洲| 欧美一区二区三区婷婷月色 | 亚洲欧美日本伦理| 亚洲中字在线| 国内欧美视频一区二区| 免费国产一区二区| 欧美日韩亚洲一区二| 亚洲女优在线| 久久精品国产在热久久| 91久久精品一区| 中文高清一区| 在线欧美电影| 中国女人久久久| 伊人久久大香线蕉av超碰演员| 欧美大片91| 国产精品成人观看视频国产奇米| 久久久精品日韩| 国产精品成人aaaaa网站| 欧美一区二区三区久久精品| 亚洲国产mv| 亚洲无线一线二线三线区别av| 国产亚洲精品aa午夜观看| 欧美肥婆在线| 国产精品久久久久一区二区三区共| 一区二区三区免费网站| 亚洲一区二区在线免费观看视频 | 999在线观看精品免费不卡网站| 99re热这里只有精品视频| 国产亚洲一级| 99亚洲一区二区| 极品裸体白嫩激情啪啪国产精品| 91久久精品久久国产性色也91 | 国模大胆一区二区三区| 久久久精品五月天| 欧美精品一区三区在线观看| 亚洲免费视频一区二区| 久久久久久网| 最新亚洲激情| 久久久国际精品| 亚洲制服欧美中文字幕中文字幕| 欧美一区二区三区四区高清 | 亚洲人在线视频| 国产亚洲精品一区二区| aa级大片欧美| 日韩午夜中文字幕| 狂野欧美激情性xxxx欧美| 欧美中文在线观看国产| 欧美网站在线观看| 亚洲精品中文字| 亚洲美女中文字幕| 男人天堂欧美日韩| 欧美~级网站不卡| 午夜精品成人在线| 1024国产精品| 欧美国产先锋| 国产精品尤物| 一本色道久久综合狠狠躁篇怎么玩 | 久久露脸国产精品| 久久精品免费| 国产婷婷色一区二区三区在线| 亚洲视屏一区| 亚洲欧美国产不卡| 国产精品电影网站| 一区二区三区国产| 亚洲制服av| 国产乱码精品一区二区三区忘忧草| 一区二区三区成人| 麻豆国产va免费精品高清在线| 女人香蕉久久**毛片精品| 日韩视频欧美视频| 一本色道久久88综合亚洲精品ⅰ| 欧美高清视频在线| 亚洲精品乱码久久久久久蜜桃91| 亚洲国产成人精品女人久久久| 久久久亚洲高清| 亚洲国产精品va在线看黑人动漫| 最新日韩av| 欧美日韩精品免费 | 亚洲一区二区三区激情| 亚洲综合99| 国产一区二区久久| 老司机67194精品线观看| 亚洲丰满在线| 亚洲第一精品夜夜躁人人躁| 亚洲午夜视频在线| 国产精品裸体一区二区三区| 国产精品亚洲一区| 国产精品白丝av嫩草影院| 在线成人h网| 欧美jizz19hd性欧美| 亚洲人成亚洲人成在线观看| 日韩视频中文字幕| 欧美性视频网站| 性欧美xxxx大乳国产app| 老色鬼精品视频在线观看播放| 亚洲电影免费观看高清完整版在线观看 | 亚洲欧洲日韩在线| 亚洲一级特黄| 一区精品久久| 国产精品福利在线观看| 久久免费99精品久久久久久| 亚洲精品美女在线观看播放| 久久国产精品高清| 一区二区不卡在线视频 午夜欧美不卡'| 久久久久久久久久久久久久一区| 国产精品色婷婷| 国产一区日韩一区| 亚洲午夜未删减在线观看| 国产精品久久久久久亚洲毛片 | 亚洲国产成人精品视频| 亚洲综合日本| 亚洲激情av在线| 国产日韩欧美一区| 欧美日韩国产成人高清视频| 午夜精品久久久久久久久| 亚洲精品网站在线播放gif| 久久久精品国产99久久精品芒果| 在线亚洲伦理| 亚洲激情第一页| 国产一区二区三区丝袜| 欧美欧美午夜aⅴ在线观看| 久久午夜视频| 欧美影院视频| 香蕉乱码成人久久天堂爱免费| 中国av一区|