初始化对象时复制构造函数/赋值运算符混淆

时间:2013-12-08 13:51:47

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

这样做之间的区别是什么:

class_name object_name = something;

class_name object_name(something);

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

2 个答案:

答案 0 :(得分:1)

如果复制构造函数是显式的,那么第一个表单只能通过编写:

来实现
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)

答案 1 :(得分: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);