0

这样做有什么区别:

class_name object_name = something;

class_name object_name(something);

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

4

2 回答 2

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)
于 2013-12-08T14:24:32.597 回答
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);
于 2013-12-08T14:32:32.233 回答