c++ - 为什么这里调用的是 Copy Constructor 而不是普通的 Constructor 和重载的赋值运算符?

标签 c++ copy-constructor

<分区>

Possible Duplicate:
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

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

最佳答案

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

C c4(c1);

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

注意:通俗地说,一个变量(这里是c4)被构造到第一个;(或者,' for multiple objects) 遇到;到那时,一切都是一种或另一种类型的构造函数。

C c4 = c1; 的情况下,编译器不必检查 most vexing parse .
但是,可以通过声明复制构造函数 explicit 来禁用 C c4 = c1; 一种语法。就此而言,任何构造函数都可以显式化,并且您可以阻止 = 登录构造。

关于c++ - 为什么这里调用的是 Copy Constructor 而不是普通的 Constructor 和重载的赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10595451/

相关文章:

c++ - 将函数应用于图像的每个像素

c++ - 带有额外 ":"或 "-"c++ 的文件名

c++ 如何解决我的内存泄漏?

c++ - 为什么为派生类定义拷贝构造函数要求定义基类的默认构造函数?

c++ - 为什么复制和 move 构造函数一起调用?

c++ - 格式良好的类定义示例,其中包含编译器删除的默认特殊成员函数

c++ - 强制 OpenMP 不在每个线程中缓存大对象

html - 不能通过 Mac OS X "open"命令使用 mailto 包含主题和正文

c++ - 复制构造函数不识别继承的成员

java - Java和C++拷贝构造函数的区别