c++ - 为什么可以从类中的对象访问类的私有变量?
问题描述
假设我们有一个具有单个private
变量的类和一个max
采用与该类相同类型的单个参数的方法:
class A
{
private:
int Number;
public:
A() : Number(0) {}
A(int val) : Number(val) {}
int max(A b)
{
if( Number > b.Number )
return Number;
return b.Number;
}
};
对我来说奇怪的是b
max 方法中的参数可以访问private
变量Number
。但是在main
函数中我们无法访问参数Number
(正如预期的那样,因为它被声明了private
)
int main()
{
A a;
a.Number = 0; // ERROR
return 0;
}
所以我的问题是为什么类中的函数在Number
声明时可以访问变量private
。
解决方案
这只是规则,仅此而已。
它旨在使成员函数,尤其是赋值运算符、复制构造函数和重载运算符等函数更易于编写。如果您不能直接访问“其他”对象的成员,那么您将需要过多的friend
声明或丑陋的“getter”;后者往往提供的只是对封装的规避。
也许您建议的方式可能是默认方式,并且引入私有和受保护的成员和函数可能需要声明
friend class;
但是 C++ 并不是这样设计的,这个提议现在将是一个可怕的突破性变化。尽管要恢复您的预期行为,但需要考虑的事情可能是声明
friend class = delete;
据我所知,这不会是一个重大变化。为什么不向 ISO C++ 委员会提出这种形式的建议呢?
推荐阅读
- node.js - GitHub 显示子模块而不是子文件夹
- vue.js - 无法读取未定义的属性“长度” - 为什么 DOM 在“创建”之前尝试加载?
- python - 尝试点击亚马逊畅销书排名(Python)
- python - Seaborn displot - 在一个图中绘制多个图
- python - 如何将 OTP 发送到 Django 中的电话号码?
- python-3.x - 向数据框熊猫添加行
- php - 如何从 PHP 上的 $_GET 值向数据库表中插入数据
- html - 在带有 Python3 的树莓中为 arduino 使用 HTML
- c# - While/for 循环直到出现特定条件
- c# - 从 NET Core Web 应用程序调用 Microsoft Graph SDK 时出现 MsalUiRequiredException