此条款解决的问题,为什么成员变量不该是public,然后所有反对public成员变量的论点同样适用于protected成员变量。于是成员变应该是private。
理由一:语法一致性,public全为成员函数,private全为成员变量(看起来就舒服,调用起来(统一都要加个函数调用符)肯定也舒服,哈哈!)
理由二:以函数取得或设定其值,即可实现“不准访问”、“只读访问”、“读写访问”、“只写访问”,也即——可细微划分访问控制权。如下举例:
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 readOnly;
int readWrite;
int writeOnly;
};
理由三:封装,其好处是“为所有可能的实现”提供弹性,确保class的约束是会获得维护,只有成员函数能影响成员变量。不封装意味不可以改变。
protected并不比public更具有封装性
有一个public成员变量,如果取消此变量,则所有使用它的客户码都会被破坏,而那是一个不可知的大量。因此public成员变量完全没有封装性。假设一个protected成员变量,最终取消此变量,则所有使用它的derived classes都会被破坏,而那往往也是一个不可知的大量。因此,protected成员变量就像public成员变量一样缺乏封装性。
一旦将一个成员变量声明为public或protected而客户开始使用它,就很难改变那个成员变量所涉及的一切。于是太多代码需要重写、重新测试、重新编写文档、重新编译。从封装的角度出发,其实只有两种访问权限:private(提供封装 )和其他(不提供封装)。