江苏市场监督管理局旗舰店,seo外包服务公司,摄影个人网站模板,集团网站信息建设情况1.前言
首先#xff0c;我们应该利用反证法#xff0c;看看为什么成员变量不该是public#xff0c;然后再了解所有反对public成员变量的论点同样适用于protected成员变量。最后得出一个结论#xff1a;成员变量应该是private。
2.为什么不用public
如果成员变量不是publ…1.前言
首先我们应该利用反证法看看为什么成员变量不该是public然后再了解所有反对public成员变量的论点同样适用于protected成员变量。最后得出一个结论成员变量应该是private。
2.为什么不用public
如果成员变量不是public客户唯一能够访问对象的办法就是通过成员函数。如果public接口内的每样东西都是函数客户就不需要在打算访问class成员时迷惑地试着记住是否该使用小括号。他们只要做就是了因为每样东西都是函数。
使用函数可以让你对成员变量的处理有着更精确的控制如果你令成员变量为public每个人都可以读写它但如果你以函数取得或设定其值你就可以实现出“不准访问”“只读访问”以及“读写访问”甚至可以实现“唯写访问”见以下代码
class AccessLevels{public:....int getReadOnly() const (return readOnly;)void setReadWrite(int value) { readWritevalue;}int getReadWrite() const (return readWriter;)void setWriteOnly(int value) {writeOnly value;}private:int noAccess;//对此int无任何访问动作int readOnly;//对此int做只读访问int readWrite;//对此int做读写访问int writeOnly;//对此int做唯写访问
};
如此细微地划分访问控制颇有必要因为许多成员变量应该被隐藏起来。每个成员变量都需要一个getter函数和setter函数是非常少见的。
如果此时还不够有说服力那就从封装性的角度出发进行分析。如果通过函数访问成员变量日后可以更改某个计算替换这个成员变量而class客户一点也不会知道class内部已经实现了变化。举个例子假设一个自动测序程序当汽车通过时其速度便被计算并填入一个速度收集器内
class SpeedDataCollection{...public:void addValue(int speed);//添加一笔新数据double averageSoFar() const;//返回平均速度....
};
现在让我们考虑成员函数averageSoFar()。做法之一是在class内设计一个成员变量记录至今以来的所有速度平均值。当averageSoFar被调用只需要返回那个成员变量就好该做法会使得每一个SpeedDataCollection对象变大因为你必须为用来存放目前平均值累计总量数据点数的每一个成员变量分配空间然而averageSoFar却可十分高效它可以只是一个返回目前平均值的inline函数。另一个做法是令averageSoFar每次被调用时重新计算平均值此函数有权力调取收集器内的每一笔速度值该方法会使得averageSoFar执行较慢但每一个SpeedDataCollection对象比较小。所以总体来说这两个方法各有优缺点。 3.总结
1切记将成员变量声明为private,这可赋予客户访问数据的一致性可细微划分访问控制。允诺约束条件获得保证并提供class作者以充分的实现弹性。
2protected并不比public更具封装性