【问题标题】:Copy constructor/Assignment operator confusion when initializing object [duplicate]初始化对象时复制构造函数/赋值运算符混淆[重复]
【发布时间】:2013-12-08 13:51:47
【问题描述】:

这样做有什么区别:

class_name object_name = something;

class_name object_name(something);

根据我阅读的here,两者都使用复制构造函数,但我不明白为什么会发生这种情况以及隐式转换如何发挥作用。我如何理解它(在阅读它之前)是第一个通过创建临时对象使用默认赋值运算符(如果未定义)然后调用复制构造函数,但这似乎是错误的。我之所以问是因为我读到,当显式复制构造函数时,第一个选项将失败,即使某些东西是 class_name 类型,所以这两个选项必须足够不同。也是在第一个选项的复制构造函数之上使用赋值运算符(使用默认或用户定义的实现)还是只是调用复制构造函数的用户友好语法形式?

【问题讨论】:

  • 这取决于something 是什么。请参阅此gotw。但两者都不涉及对赋值运算符的调用。

标签: c++ copy-constructor copy-assignment copy-initialization


【解决方案1】:

复制构造函数和赋值运算符不是一回事。

   Test(const Test &t)
   {
      std::cout<<"Copy constructor called "<<std::endl;
   }
   Test& operator = (const Test &t)
   {
      std::cout<<"Assignment operator called "<<std::endl;
      return *this;
   }

  Test t1, t2;
  t2 = t1;
  Test t3 = t1;

在此示例中,为t2 = t1 调用赋值运算符,为t3 = t1 调用复制构造函数。

如果你明确复制构造函数,你必须像这样调用它:

Test t3(t1);

【讨论】:

    【解决方案2】:

    如果复制构造函数是显式的,第一种形式只能通过写来实现:

    class_name object_name = class_name(something);
    

    即显式调用复制构造函数。

    不过,最后,如果复制构造函数是显式的,如果它是明确的,只需使用第一种形式(注意最令人烦恼的解析),或者对于额外的 c++11 点,使用大括号初始化语法,它永远不会模棱两可:

    class_name object_name{something};
    

    或者使用 Herb Sutter 的“几乎总是自动”的想法:

    auto object_name = class_name{something};
    

    为了回答您的其他问题,此处不使用赋值或复制赋值运算符。复制赋值运算符用于将副本分配给先前初始化的变量:

    class_name object_name;
    object_name = class_name(something); // uses class_name& operator= (class_name& other)
    

    【讨论】:

    • 很高兴知道。如果构造函数是显式的,为什么我不能使用第一个选项?我认为使函数显式意味着我们限制转换。考虑到“某物”的类型正确,我只是不明白这与我们的第一个选项有什么关系。
    • 对此,请看这个问题的答案:stackoverflow.com/questions/4153527/…
    • -1 这里没有使用赋值运算符,句号。
    • 你是对的,但请先纠正我,然后再投反对票。
    • 在此处查看指导:stackoverflow.com/help/privileges/vote-down 我非常愿意被纠正,我们都在这里学习。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多