在C++类设计中,C++成员变量都应该设置为private,其理由如下:
1)保持语法一致性
如果所有的成员变量都是private,那么用户访问成员变量时都必须通过调用函数,保证了调用的一致性。如类对象a,它有一个成员函数GetName(), 它调用函数获取成员变量name的形式:a->GetName(),而如果直接将name声明为public,那么它的调用形式为:a->name。也即类对象调用成员函数和成员变量的形式是不一样的,造成了语法上的不一致性。
2)可以对成员变量的处理有更精确的控制
如果将成员变量设置为public,那么用户可以对其进行随意的读写操作,而如果用成员函数来控制,那么可以实现其是否可访问,是否可读,是否可写等属性。如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 class AccessLevels 2 { 3 public: 4 int getReadOnly() const { return readOnly; } 5 void setReadWrite(int value) { readWrite = value;} 6 int getReadWrite() const { return readWrite; } 7 void setWriteOnly(int value) { writeOnly = value; } 8 private: 9 int noAccess; //can't access 10 int readOnly; // only can read 11 int readWrite; // can read and write 12 int writeOnly; // only can write 13 };
3)满足封装性
public成员变量不具备封装性,用户可以读写它们,这样一来就有可能发生这种情况:如果在后期的维护中某一个public成员变量被取消了,那么这就必须在所有使用过这种成员变量的代码中进行修改,因而可能会造成大量的代码破坏量。如果将成员变量控制在函数中,那么实现的可能性就会有很多种,即弹性很大,可以在读取或修改时通知其他对象,可以验证class的约束条件,可是实现多线程中的同步控制等等。
此外,protected与public成员变量类似的无法满足上面的三个条件,因此在类的声明和定义中,最好将成员变量声明为private属性。
以上整理子Effective C++中文版第三版 case22.