【发布时间】:2013-02-01 17:35:44
【问题描述】:
在这个简化的示例中,我的问题是:我是否在 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;
}
让我吵闹的是,
- 当调用 setUser 时,Action 的“用户”属性会发生什么变化?它被摧毁了吗?它曾经建造过吗?
- 如果我第二次调用 setUser 会发生什么?
- 如果我删除 setUser 中的“&”符号,一切都会好起来的,对吧?因为这就像传递参数的副本,对吧?
我担心我在用内存做疯狂的事情,因为属性没有被正确地破坏......
谢谢
于 2013 年 2 月 18 日星期一编辑
非常感谢!我非常感谢您的所有回复...
我不知道编译器提供了默认的重载赋值运算符。现在我知道一切都说得通了……
再次感谢。
【问题讨论】:
-
除了
const User& u可能会更好之外,分配还不错。它会在没有中间副本的情况下将用户复制到 by-val 参数。 Action 的现有用户不会被销毁setUser(u),而是会通过赋值运算符“覆盖”。如果您愿意,您可以通过自己编写User::operator =(const User& u)来控制如何完成。关于第二个电话,与第一个电话相同。最后,删除 & 将引入至少一个额外的副本。 -
我想知道你写的最后一句话:“我担心我在用内存做疯狂的事情,因为属性没有被正确销毁” - 你是什么意思通过“被正确销毁”?您如何看待这个问题?
标签: c++ reference variable-assignment