将对象私有分配时的c ++

时间:2011-10-29 12:13:37

标签: c++ class

所有。我是c ++的新手,我想问一个关于分配对象的问题。

例如,

我有2个来自同一个类的对象,a1和a2。 如果班上有一些私人会员

为什么我们可以这样做 a1 = a2;

我的问题是,我认为只有成员函数才有权限 更改私有成员数据的内容,但通过步骤 我刚刚通过,私人会员数据很容易改变。 为什么???

5 个答案:

答案 0 :(得分:5)

可以使用operator=成员函数执行赋值,根据定义,该函数可以访问私有成员。

如果未定义一个,则提供默认值:“默认版本执行成员复制,其中每个成员由其自己的复制赋值运算符复制(也可以是程序员声明的或编译器生成的)。 “请参阅this

答案 1 :(得分:2)

除了“对象”之外,调用者不知道正在复制什么。来电者根本不知道有私人会员。 赋值运算符是公共的,任何公共方法的行为都是相同的 - 公共方法当然可以修改私有成员。

答案 2 :(得分:2)

私有成员和方法仅限于类,而不是特定实例。您可以从同一类的对象访问不同类实例中的私有成员。此行为是设计使然,并由标准保证。

如果你没有覆盖赋值运算符(A& A::operator = (const A& other)),那么你最有可能做一个浅表副本。

答案 3 :(得分:2)

你是对的。但是在您概述的情况下,您调用a1的成员函数。公共成员函数YourClass& operator=(const <YourClass>& rightHandSide)具体。如果您没有自己提供,编译器会自动生成这样的方法。如果你想阻止编译器生成一个并且严格按照上面描述的方式不希望赋值,只需声明operator= private,并且根本不提供定义。这将导致编译器在a1 = a2投诉。

另一件令人困惑的事情是,问题方法operator=究竟如何读取rhs的私有数据。这正是Luchian Grigore所概述的:他们是班级的私人,而不是实例。

答案 4 :(得分:0)

a1 = a2;在这种情况下,调用a1对象(即目标对象)的隐式“复制赋值运算符”,该对象是公共的并且存在于a1和a2中。 “复制赋值运算符”的作用是将所有数据成员从一个对象复制到另一个对象。