C++ 为什么对象的副本不允许访问原始对象的私有变量?
c++ why doesn't a copy of an object allow access to a private variable of the original?
例如,
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
成为类的朋友(在类声明中(,以及任何全局实现的运算符。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 将私有对象变量与用户输入的变量进行比较
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何对对象数组进行排序,而不考虑对象变量类型
- 在功能中设置对象变量
- 如何创建对象变量,以便每次分配新的指针
- C++ FileIO 以读取和写入对象变量
- 私下声明的对象变量的突变器/访问器方法
- C++ 列表中的对象变量在迭代过程中不会更新
- 稍后使用私有对象变量时如何初始化数组(初始化对象后)
- 通过向量更改对象变量的值
- C 全局对象变量内存释放
- 基本数据类型变量 VS 对象变量
- C 复制分配运算符,用于参考对象变量
- c++从列表中移除元素,并将其分配给对象变量
- 我们是否需要在C++中同步局部对象变量
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- 无法访问在 std 回调中传递的对象变量