C++ 为什么对象的副本不允许访问原始对象的私有变量?

c++ why doesn't a copy of an object allow access to a private variable of the original?

本文关键字:对象 变量 原始 不允许 为什么 副本 C++ 访问      更新时间:2023-10-16

例如,

Number operator+(Number a, Number b) {
    return Number(a.x + b.x);

}

这会导致某种"无法访问私人成员错误"吗。我知道,如果我不通过引用传递,数字a和数字b会复制到堆栈上,并在函数体中使用。然而,我不明白他们为什么不允许访问原件的私人成员。我怎么会误解物体的概念?还有为什么朋友和成员的函数不需要通过引用传递?

operator+是一个未绑定的函数,即它不是Number的成员,因此,这是规则,它不能隐式访问私有成员。

通过值或引用传递Number对象不会影响规则。访问保护应用于Number对象的每次访问,即使它是您的私有、基于堆栈的副本。

至少有三种出路:

  • 宣布Number operator+(Number, Number)Number的好友
  • x添加一个公共getter,以便可以访问该变量
  • 作为类的成员实现+=运算符,并根据它实现自由运算符:return Number(a) += b;

你肯定误解了什么。'"引用传递"、"在堆栈上复制"等与访问规则完全无关。

上面的代码是一个错误,因为运算符+不是Number的成员,而且(可能(它也不是Number的朋友。因此它无法访问私人成员。这就是它的全部。

正如许多人所回答的那样,运算符+不是Number类的成员,它是一个全局变量。考虑函数Show:

void Show(const Number& numberObj) // const, by-ref is IMMATERIAL 
{
   std::cout<< numberObj.x;
}

和一种方法显示:

class Number
{
private:
    int x;
public:
    void Show()
    {
       std::cout << x;
    }
};

现在,如果用任何重载运算符替换Show,并使用1或2个参数——只有类成员可以访问私有数据,而全局实现不能。

为此,您需要使全局Show成为类的朋友(在类声明中(,以及任何全局实现的运算符。