在这个简化的例子中,我的问题是:我在Action :: setUser()中进行合法分配吗?
class User {
private:
int age;
public:
int getAge() { return age; }
};
class Action {
private:
User user;
public:
void setUser(User &u) {
user = u;
}
};
int main() {
User u;
Action a;
a.setUser(u);
return 0;
}
让我感到吵闹的是,
我担心我正在用内存做疯狂的事情,因为属性没有被正确销毁......
谢谢
2013年2月18日星期一编辑
非常感谢你!我非常感谢您的所有回复......
我不知道编译器提供了默认的重载赋值运算符。现在我知道一切都很有道理......
再次感谢。
答案 0 :(得分:4)
调用setUser时Action的“user”属性会发生什么?
赋值运算符(由编译器提供,因为您尚未定义自定义运算符)被调用,它只执行从u
到{{1}的成员方复制}}
它被摧毁了吗?
没有
它有没有建成?
是
如果我第二次调用setUser会发生什么?
同样的事情。
如果我删除“&”在setUser中的符号,一切都会好的,对吧?
就user
的转让而言,这没有任何区别。通过引用传递只是意味着在调用函数时不会生成参数的副本。
答案 1 :(得分:1)
是的,没关系。它只是从您在main中定义的u
直接分配到a.user
。参考参数可以避免将额外的副本传递给a.setUser
。
创建Action
时,它包含默认构造的User
对象。然后,您将为User
分配值。这不是(IMO)最好的设计(我宁愿看到用正确值构造的User
)但它们都是完全有效的。
赋值不会创建或破坏现有值。 Action
对象在超出范围时将被销毁,这将破坏它包含的User
对象。
答案 2 :(得分:1)
数目:
&
,则会传递副本。但它并没有让事情变得错误或正确。注意:
答案 3 :(得分:1)
class Action {
private:
User user;
}
定义类型为User
的私有成员。它是一个具有自动存储持续时间的对象,它是在构造类型为Action
的对象时构造的。它的生命周期与Action
类型的对象的生命周期相关联。
现在用这种方法:
void setUser(User &u) {
user = u;
}
u
是对象的引用,其属性(成员)将用于通过 赋值运算符 设置user
的属性
如果你在这里删除&
,你将通过引用传递值来改变传递,这意味着传递给这个方法的对象的副本将在调用时创建。