Effective C++ 第二十二條 Declare data members private.
將成員變量聲明為 private
????????我們?cè)诼暶饕粋€(gè)類的時(shí)候,肯定也會(huì)為類設(shè)計(jì)成員變量,但是這些成員變量究竟是 public、private 還是 protected 要具體分析。
????????通常來(lái)說,不要把成員變量設(shè)置為 public 和 protected ,如果把成員變量設(shè)置為 public ,看如下例子
????????這樣代碼可以正常運(yùn)行,但是我們的類不一定萬(wàn)年不變,也許在某一次的優(yōu)化中我們的類改寫成了以下這樣
????????那么客戶的代碼中的 rhs.val += 1 就會(huì)成為無(wú)效代碼,如果需要實(shí)現(xiàn)同樣功能,就要改寫為 rhs.reviseVal( rhs.getVal() + 1);
????????這樣就會(huì)給客戶代碼造成極大的影響,凡是涉及到原先直接調(diào)用 Test::val 的代碼全都要重寫返工,這個(gè)影響可能會(huì)很大。
如果把成員變量設(shè)置為 protected ,那么就會(huì)影響繼承該類的子類
代碼正常運(yùn)行,輸出 3
但是一旦 Base 修改之后,如下
????????就這么一個(gè)小小的改動(dòng),Derived 中所有關(guān)于 val 的操作全都失效。protected 繼承對(duì) Derived 的影響很大。
所以最好的方式還是采取 private 繼承,不讓外界和 Derived 調(diào)用成員函數(shù),而是留出接口
????????通過將成員變量設(shè)置為 private,再設(shè)置讀、寫接口實(shí)現(xiàn)控制成員變量 “可讀可寫”、“只讀不寫”、“只寫不讀”、“不讀不寫”,這樣雖然有點(diǎn)繁瑣,但是并不是所有成員變量都需要接口。這樣的安全性是最強(qiáng)的。protected 并不是比 public 更具有封裝性。