Effective C++ 第二十二条 Declare data members private.
将成员变量声明为 private
我们在声明一个类的时候,肯定也会为类设计成员变量,但是这些成员变量究竟是 public、private 还是 protected 要具体分析。
通常来说,不要把成员变量设置为 public 和 protected ,如果把成员变量设置为 public ,看如下例子
这样代码可以正常运行,但是我们的类不一定万年不变,也许在某一次的优化中我们的类改写成了以下这样
那么客户的代码中的 rhs.val += 1 就会成为无效代码,如果需要实现同样功能,就要改写为 rhs.reviseVal( rhs.getVal() + 1);
这样就会给客户代码造成极大的影响,凡是涉及到原先直接调用 Test::val 的代码全都要重写返工,这个影响可能会很大。
如果把成员变量设置为 protected ,那么就会影响继承该类的子类
代码正常运行,输出 3
但是一旦 Base 修改之后,如下
就这么一个小小的改动,Derived 中所有关于 val 的操作全都失效。protected 继承对 Derived 的影响很大。
所以最好的方式还是采取 private 继承,不让外界和 Derived 调用成员函数,而是留出接口
通过将成员变量设置为 private,再设置读、写接口实现控制成员变量 “可读可写”、“只读不写”、“只写不读”、“不读不写”,这样虽然有点繁琐,但是并不是所有成员变量都需要接口。这样的安全性是最强的。protected 并不是比 public 更具有封装性。