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

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

<分区>

这样做有什么区别:

class_name object_name = something;

class_name object_name(something);

从我读到的here ,两者都使用复制构造函数,但我不明白为什么会发生这种情况以及隐式转换如何发挥作用。我如何理解它(在阅读它之前)是第一个通过创建临时对象使用默认赋值运算符(如果未定义)然后调用复制构造函数但这似乎是错误的。我问是因为我读到当显式复制构造函数时,第一个选项将失败,即使某些东西是 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);

关于c++ - 初始化对象时复制构造函数/赋值运算符混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20454173/

相关文章:

c++ - 非固定类型枚举范围定义的动机

c++ - boost spirit : Difference between operators "%=" and "="

c++ - 为什么删除模板复制构造函数会导致赋值运算符功能失调?

C++:从另一个构造函数隐式调用构造函数

c++ - 填充插入() - 复制构造函数和复制赋值 noexcept 状态?

c++ - 函数没有被 g++ 内联

c++ - 在 std::wstring 中查找方法

c++ - 模板化线性代数 vector 类中出现奇怪的 "Member function not viable"错误

c++ - 为什么复制赋值运算符的参数应该是引用?

c++ - 为什么在 C++ 中分配对象的地址不会改变?