将成员变量声明为 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
int readOnly; // 对这个int的只读访问
int readWrite; // 对这个int的读写访问
int writeOnly; // 对这个int的只读写访问
};
更重要的是为了封装!!!如果你通过函数实现了对数据成员的访问,那么以后可以替换,使用者并不会察觉。将数据成员隐藏在函数接口之后可以提供各种实现灵活性。
class SpeedDataCollection {
...
public:
void addValue(int speed); // 添加一个速度值
double averageSoFar() const; // 返回平均速度
...
};
如何实现averageSoFar函数?
- 在类中添加一个数据成员,记录目前为止收集到的所有速度数据的平均值。
- 在每次调用averagesfar时重新计算它的值。
重要的是,通过成员函数访问平均值(即通过封装它),可以交换这些不同的实现,而客户只需要重新编译。
一旦将数据成员声明为public或protected,并且客户已经开始使用它,就很难更改有关该数据成员的任何内容。太多的代码需要重写、重新测试、重新编写文档或重新编译。 - 将数据成员声明为私有。它为客户提供了语法上一致的数据访问,提供了细粒度的访问控制,允许强制执行不变式,并为类作者提供了实现灵活性。
- protected并不比 public 更具封装性。