可能重复:
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
这似乎让我感到困惑,因为在这段代码中虽然我在声明时初始化,但它是通过赋值运算符而不是复制构造函数。我理解错了吗?
答案 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 );
是的,恕我直言,一般更可取。在这种情况下
初始化表达式与新对象具有相同的类型,但是,
没有区别。)