为什么C ++允许返回对私有成员的引用

时间:2013-11-17 08:32:17

标签: c++ language-design

class test {
public:
test(int value = 0): x(value) {}
int& get(){
    return x;
}
private:
int x;
};

这将允许客户端代码改变私有成员
这在C ++中是合法的,但为什么呢?
是否有任何情况你真的需要打破类封装?

3 个答案:

答案 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”的指针重新解释为一个整数,并以这种方式访问​​私有字段。