Effective C++:條款22:將成員變數聲明為private

來源:互聯網
上載者:User

標籤:彈性   set   content   round   實現   一個   客戶   ssl   read   

(一)為什麼不採用public成員變數

(1)首先,從文法一致性考慮,客戶唯一能訪問對象的方法就是通過成員函數,客戶不必考慮是否該記住使用小括弧()。

(2)其次,使用函數能夠讓我們對成員變數的處理有更精確的控制。假設我們令成員變數為public,那麼每一個人都能夠讀寫它。

但假設我們以函數取得或設定其值。我們就能夠實現出“不準訪問”、“僅僅讀訪問”以及“讀寫訪問”。我們甚至能夠實現“惟寫訪問”。

class AccessLevels { public: //成員noAccess無不論什麼訪問動作,實現不準訪問!    int getReadOnlay() const {return readOnly;}   //對這個資料成員設定為僅僅讀訪問!           void setReadWrite(int value){readWrite = value;}   //這個函數設定該資料成員可寫訪問。    int getReadWrite()const {return readWrite;}       //這個函數設定該資料成員可讀訪問!

void setWriteOnly(int value){writeOnly = value;} //這個函數設定該資料成員惟寫訪問!private: int noAccess; int readOnly; int readWrite; int writeOnly; };

像這樣細微地劃分訪問控制頗有必要。由於很多成員變數應該被隱藏起來。每一個成員變數都須要一個getter函數和setter函數畢竟罕見。

(3)最後。還有封裝性。

假設通過函數訪問成員變數。日後可改以某個計算替換這個成員變數,客戶不會知道class內部實現已經起了變化。

成員變數隱藏在函數介面的背後,能夠為“全部可能的實現”提供彈性。比如這可使得成員變數被讀或被寫時輕鬆通知其它對象、能夠驗證class的約束條件及函數的前提和事後狀態、能夠在多線程環境中運行同步控制。

。等等。

封裝性很重要。假設對客戶隱藏成員變數(也就是)封裝。保留了日後變更實現的權力。public意味著不封裝,不封裝意味著不可改變。


(二)

protected成員變數就像public成員變數一樣缺乏封裝性:成員變數的封裝性與“成員變數的內容改變時所破壞的代碼數量”成反比,假設一個public成員變數。我們取消了它。全部使用它的客戶碼都會被破壞,那是一個不可知的大量。

所以public成員函數全然沒有封裝性。如果一個protected成員變數,我們取消了它。全部使用它的derived classes都會被破壞。往往也是一個不可知的大量。



請記住:

(1)切記將成員變數聲明為private。

這可賦予客戶訪問資料的一致性。可細微劃分訪問控制,允諾約束條件獲得保證,並提供class作者以充分的實現彈性。
(2)protected並不比public更具封裝性。



Effective C++:條款22:將成員變數聲明為private

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.