为什么在这里调用复制构造函数而不是普通的构造函数和重载的赋值运算符?

时间:2012-05-15 06:44:18

标签: c++ copy-constructor

  

可能重复:
  Is there a difference in C++ between copy initialization and direct initialization?
  Copy constructors and Assignment Operators

我有一个C类,我在其中重载了Normal,复制构造函数和赋值运算符来打印所调用的内容。

我编写了以下代码来测试什么时候被调用?

C c1;                --> Normal Constuctor .. // understood Fine

C c2;
c2 = c1;             --> Normal constructor + assignment operator .. //understood Fine

C * c3 = new C(C1)   --> Copy constructor  // Understood Fine

C c4 = c1          --> copy constructor // Not Able to understand

这似乎让我感到困惑,因为在这段代码中虽然我在声明时初始化,但它是通过赋值运算符而不是复制构造函数。我理解错了吗?

3 个答案:

答案 0 :(得分:14)

因为C c4 = c1; 语法上在语义上等同于:

C c4(c1);

在这种特殊情况下,两者都会调用复制构造函数。然而,“复制初始化”(第一语法)和“直接初始化”(第二语法)之间存在细微差别。看看this回答。

注意:在“外行人的条款”中,变量(此处c4)构建到第一个;(或,'为遇到多个对象;直到那时一切都是一种或另一种类型的构造函数。

如果是C c4 = c1;,编译器不必检查most vexing parse 但是,可以通过声明复制构造函数 C c4 = c1; 来禁用explicit种语法。就此而言,任何构造函数都可以明确,您可以阻止=签署构造。

答案 1 :(得分:8)

C c4 = c1;

复制初始化

尝试将c1转换为类型C,如果它已经不是那种类型,只需找到合适的转换函数,然后使用创建的C实例进行复制构建新的C实例。

请注意,

C c4(c1);

直接初始化

值得注意的是, Copy Initialization and Direct Initialization they are not the same!

之间存在差异

为什么C c4 = c1;在语法上等同于C c4(C1)而不是C C4; c4 = c1;为什么这样做?
首先,复制初始化&直接初始化是不一样的 至于为什么没有调用赋值运算符的基本原理,只有当一个对象分配两个完全形成的对象时才会进行赋值。

如果:

C c4 = c1;

c1是一个完全构造的对象,而c4并不是全部存在,当出现这种情况并且存在=时,它并不意味着赋值,但它意味着初始化。
所以基本上,这里发生的是Initialization而不是Assignment,C ++ Standard定义了如何进行初始化的具体规则。

答案 2 :(得分:1)

因为在:

中没有赋值运算符
C c4 = c1;

与逗号一样,等号可以是运算符或标点符号。 在表达式中,它始终是一个运算符,但在上面, 初始化表达式只是c1; =标志是标点符号, 指示复制初始化,而不是直接初始化, 是用的。 (直接初始化将是

C c4( c1 );
是的,恕我直言,一般更可取。在这种情况下 初始化表达式与新对象具有相同的类型,但是, 没有区别。)