class test {
public:
test(int value = 0): x(value) {}
int& get(){
return x;
}
private:
int x;
};
这将允许客户端代码改变私有成员
这在C ++中是合法的,但为什么呢?
是否有任何情况你真的需要打破类封装?
答案 0 :(得分:3)
将会员设为私人,意味着您无法直接访问 。但没有什么限制你通过公共成员间接访问它。这取决于你的设计。你甚至可以这样做:
class test {
public:
test() : x(y) {}
int &x;
private:
int y;
};
在您的课程中,假设您想要计算成员读/写的次数。所以,你可以使它private
然后放一个成员函数,它返回对变量的引用:
class test {
public:
test(int value = 0): x(value), count(0) {}
int& get(){
count++;
return x;
}
private:
int x;
int count;
};
我希望这个例子说明如何将一个成员设为私有,然后对它进行间接访问是有用的。
答案 1 :(得分:2)
首先,我们考虑实施您所描述的内容。这样做会非常繁重。你的例子很简单。但是如果引用在它到达暴露它的函数之前流过了许多函数呢?编译器必须进行异常复杂的静态分析,超出了编译器编写者合理期望的静态分析级别。
因此,即使设计师想要禁止这样做,也不可能这样做。设计师想要阻止这个吗?非常可疑。如果他们这样做了,如何在容器或字符串上实现[]运算符?
是否有任何您需要的情况 打破类封装
作为容器和字符串上的[]运算符的示例,此功能实际上用于支持封装。
答案 2 :(得分:1)
为什么呢?因为C ++主要试图让你做任何你想做的事情,而不是妨碍你;它不会非常努力地保证你的安全。如果您想要一种安全的语言,请使用其他语言。如果你愿意,你可以使用像面向对象的东西,但是如果你想要突破这一点,你就会有更大的力量。拥有权利的同时也被赋予了重大的责任。
你甚至不需要打破封装,这是值得的。你可以简单地将一个指向“test”的指针重新解释为一个整数,并以这种方式访问私有字段。