为什么成员变量不能是public、protected
语法一致性
- 如果成员变量不是public,客户唯一可能访问对象的方法就是通过成员函数
- 如果public接口内的每样东西都是函数,客户就不需要在打算访问类成员函数时记住是否应该使用()
使用函数可以让你对成员变量的处理有更精确的控制
- 如果你令成员变量为public,每个人都可以读写它
- 如果你通过函数获得或者设定值,可以实现"不准访问"、“只读访问”、“只写访问”、“读写访问”
class AccessLevels{
public:
int getReadOnly()const {return readOnly; }
void setReadOnly(int value) {readWrite = value; }
int getreadWrite() const {return readWrite ; }
void setWriteOnly(int value) { writeOnly = value;};
private:
int noAccess; // 不准访问
int readOnly; // 只读访问
int readWrite; // 读写访问
int writeOnly; // 只写访问
}
封装
-
如果你通过函数访问成员变量,日后打算该以某个计算来替换这个成员变量,客户无需关心。
-
将成员变量隐藏在接口的后面,可以为"所有可能的实现"提供弹性。比如,这可以使得成员变量被读或者被写时轻松通知其他对象、可以验证类的约束条件以及函数的前提和事后状态、可以在多线程环境中执行同步控制…
protected成员变量的论点和public一样:语法一致性、细微划分的访问控制、封装
从封装的角度来看,其实只有两种访问权限:private(提供封装)和其他(不提供封装)
总结
- 切记将成员变量声明为private。这可以赋予客户访问数据的一致性、可细微划分访问控制,允诺约束条件获得保证,并提供类作者以充分的实现弹性
- protected并不比public更具封装性
- 一般来说,非成员函数禁止使用私有成员,但是我们可以通过地址操作和显式类型转换绕过私有保护,当然这是一种欺骗。C++只能防止意外而无法防止故意规避。只有硬件可以完美防止对通用语言的恶意使用,而这在实际系统中其实是很难实现的。