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



这样做有什么区别:

class_name object_name = something;

class_name object_name(something);

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

复制构造函数和赋值运算符不是一回事。
   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);

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

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)

最新更新