为什么要将成员变量声明为private
为什么要将成员变量封装为private,主要有以下四个原因:
①好处1:如果成员变量不是public,那么客户唯一能访问成员变量的唯一方式就是通过成员函数。如果public接口内的每样东西都是接口函数,那么客户在访问类是就不需要考虑用不用使用(),因为每样东西都是函数,都需要用()。
②好处2:可以使对成员变量的处理更加精确。如果你令成员变量为public的,那么每个人都可以读写它;但是如果你将它声明为private的,你可以根据自己需求实现“不准访问”、“只读访问”、“只写访问”、“读写访问”。
如:通过以下成员函数就可以实现对封装起来的成员变量的精准控制。
class AccessLevels {
public:
...
int getReadOnly() const {
return readOnly;
}
void setWriteOnly(int val) {
writeOnly = val;
}
void setReadWrite(int val) {
readWrite = val;
}
int getReadWrite() const {
return readWrite;
}
private:
int noAccess;
int readOnly;
int writeOnly;
int readWrite;
};
③好处3:封装。如果你通过函数访问成员变量,日后可改以某个计算来替换这个成员变量,而class用户一点也不会知道class内部已经出现了变化,为访问成员变量的实现提供更多可能。
如:我们要访问数组的平均值,一种方法是设立一个平均值的成员变量,并且定义一个成员函数,每次只需要返回成员变量的值就行了;或者另一种方法,不定义成员变量,直接定义一个计算平均值的函数,每次调用的时候计算平均值。
这样当我们为了节省内存改变了MyArray结构时,用户可以继续调用getAvg()的接口,而不会感觉到类其实内部已经发生了变化。
class MyArray {
public:
...
int getAvg() const {
return avg;
}
private:
vector<int> arr;
int avg;
};
class MyArray {
public:
...
int getAvg() const {
int sum = 0;
for (int i : arr) {
sum += i;
}
return sum / arr.size();
}
private:
vector<int> arr;
};
好处④public和protected意味着不封装,不封装意味着不能改变。如果不封装,我们之后将public或protected的成员变量改变成private之后,将会破坏大量的用户的代码。
如:求数组平均值的类,我们不进行封装,用户直接使用了这些不封装的类。
class MyArray {
public:
...
vector<int> arr;
int avg;
};
int main() {
Myarray nums;
nums.arr.push_back(10);
nums.arr.push_back(10);
nums.arr.push_back(10);
cout << nums.avg << endl;
return 0;
}
当我们之后又想将arr和avg变成private时会发现用户的代码出现的大量的错误,如果要修改将会耗费大量的力气。
class MyArray {
public:
...
private:
vector<int> arr;
int avg;
};
int main() {
Myarray nums;
nums.arr.push_back(10);
nums.arr.push_back(10);
nums.arr.push_back(10);
cout << nums.avg << endl;
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)