这个C ++引用分配是否正确?

时间:2013-02-17 00:37:58

标签: c++ reference variable-assignment

在这个简化的例子中,我的问题是:我在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的“user”属性会发生什么?它被摧毁了吗?有没有建成?
  • 如果我第二次调用setUser会怎样?
  • 如果我删除“&”在setUser中的符号,一切都会好的,对吧?因为那就像传递参数的副本一样,对吗?

我担心我正在用内存做疯狂的事情,因为属性没有被正确销毁......

谢谢


2013年2月18日星期一编辑

非常感谢你!我非常感谢您的所有回复......

我不知道编译器提供了默认的重载赋值运算符。现在我知道一切都很有道理......

再次感谢。

4 个答案:

答案 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)

数目:

  • 它没有被破坏而是被覆盖(复制分配)。是的,它是之前构建的。
  • 与第一次相同。
  • 如果您删除&,则会传递副本。但它并没有让事情变得错误或正确。

注意:

  • 在成员函数和传递的参数上使用const。
  • 您至少需要考虑控制复制和分配。这应该在任何更好的C ++简介或FAQ中解释。

答案 3 :(得分:1)

class Action {
private:
   User user;
}

定义类型为User的私有成员。它是一个具有自动存储持续时间的对象,它是在构造类型为Action的对象时构造的。它的生命周期与Action类型的对象的生命周期相关联。

现在用这种方法:

void setUser(User &u) {
    user = u;
}

u是对象的引用,其属性(成员)将用于通过 赋值运算符 设置user的属性

如果你在这里删除&,你将通过引用传递值来改变传递,这意味着传递给这个方法的对象的副本将在调用时创建。