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

C++ 为什么是C++;允许返回对私有成员的引用,c++,language-design,C++,Language Design,这将允许客户端代码对私有成员进行变异 这在C++中是合法的,但是为什么?br> 是否存在需要破坏类封装的情况?将成员设为私有,意味着您无法直接访问它。但没有任何东西限制您通过公共成员间接访问它。这取决于你的设计。您甚至可以这样做: class test { public: test(int value = 0): x(value) {} int& get(){ return x; } private: int x; }; 在您的类中,假设您想计算一个成员的读/写次数。因此,您可

这将允许客户端代码对私有成员进行变异
这在C++中是合法的,但是为什么?br>
是否存在需要破坏类封装的情况?

将成员设为私有,意味着您无法直接访问它。但没有任何东西限制您通过公共成员间接访问它。这取决于你的设计。您甚至可以这样做:

class test {
public:
test(int value = 0): x(value) {}
int& get(){
    return x;
}
private:
int x;
};
在您的类中,假设您想计算一个成员的读/写次数。因此,您可以将其设置为私有,然后放置一个返回变量引用的成员函数:

class test {
public:
   test() : x(y) {}
   int &x;
private:
   int y;
};

我希望这个例子说明如何将一个成员设置为私有,然后对其进行间接访问是有用的。

将一个成员设置为私有,意味着您不能直接访问它。但没有任何东西限制您通过公共成员间接访问它。这取决于你的设计。您甚至可以这样做:

class test {
public:
test(int value = 0): x(value) {}
int& get(){
    return x;
}
private:
int x;
};
在您的类中,假设您想计算一个成员的读/写次数。因此,您可以将其设置为私有,然后放置一个返回变量引用的成员函数:

class test {
public:
   test() : x(y) {}
   int &x;
private:
   int y;
};

我希望这个例子能说明如何将一个成员设置为私有,然后对其进行间接访问是有用的。

为什么?因为C++主要是让你做任何你想做的事,而不是妨碍你。它不会尽力保护你的安全。如果你想要一种安全的语言,可以使用其他语言。如果你想的话,你有一些类似于面向对象的东西,但是如果你想打破它,你就有更多的力量。权力越大,责任越大


你甚至不需要它来破坏封装,这是毫无价值的;您可以简单地将指向“test”的指针重新解释为整数,并以这种方式访问私有字段。

为什么?因为C++主要是让你做任何你想做的事,而不是妨碍你。它不会尽力保护你的安全。如果你想要一种安全的语言,可以使用其他语言。如果你想的话,你有一些类似于面向对象的东西,但是如果你想打破它,你就有更多的力量。权力越大,责任越大


你甚至不需要它来破坏封装,这是毫无价值的;您可以简单地将指针“test”重新解释为一个整数并以这种方式访问私有字段。

< P> Ffirst,让我们考虑实现您所描述的。正确地这样做将是非常繁重的。你的例子很简单。但是,如果引用在到达公开它的函数之前流经多个函数,该怎么办?编译器必须进行异常复杂的静态分析,超出了编译器编写人员合理期望的静态分析级别

因此,即使设计师们想禁止这种做法,也不可能做到。设计师们会想阻止这一切吗?很可疑。如果他们这样做了,如何在容器或字符串上实现[]运算符

是否有任何情况下,你真的需要 打破类封装


作为容器和字符串上的[]操作符的例子,这个特性实际上是用来支持封装的。

< P> Ffirst,我们考虑执行你所描述的。正确地这样做将是非常繁重的。你的例子很简单。但是,如果引用在到达公开它的函数之前流经多个函数,该怎么办?编译器必须进行异常复杂的静态分析,超出了编译器编写人员合理期望的静态分析级别

因此,即使设计师们想禁止这种做法,也不可能做到。设计师们会想阻止这一切吗?很可疑。如果他们这样做了,如何在容器或字符串上实现[]运算符

是否有任何情况下,你真的需要 打破类封装


正如容器和字符串上的[]运算符示例所示,此功能实际上用于支持封装。

容器经常使用此功能,以便对容器进行索引可以正常工作。请参阅您没有破坏封装。作为
类测试的编码者
,没有什么能阻止你改变游戏和提供该参考的后端。代码的用户仍然会得到一个热int引用,您选择公开它。如果你不想这样做,坦白地说,不要这样做。“为什么”这是一个语言规范。您可以问C++的发明人。相关的问题是:容器经常使用它,这样索引到容器中的行为自然。作为
类测试的编码者
,没有什么能阻止你改变游戏和提供该参考的后端。代码的用户仍然会得到一个热int引用,您选择公开它。如果你不想这样做,坦白地说,不要这样做。“为什么”这是一个语言规范。您可以更好地询问C++发明人。相关问题:标准容器上的“代码>运算符[] /代码>不会返回对私有成员的引用。它返回一个私有成员(直接或间接)指向的对象的引用。这可能是一个技术问题,但我认为这是本例中的一个重要区别,因为
操作符[]
所做的实际上是有用的,而且有点困难(但并非不可能)找到一个实际返回私有成员引用的有用示例。
operator[]
在标准容器上不会返回对私有成员的引用。它返回一个私有成员(直接或间接)指向的对象的引用。这可能是一个技术问题,但我认为这是本例中的一个重要区别,因为
操作符[]
所做的实际上是有用的,而且有点困难(但并非不可能)找到一个实际返回引用的有用示例