关于c++复制构造函数调用的问题

Question regarding C++ Copy Constructor call

本文关键字:函数调用 问题 c++ 复制 关于      更新时间:2023-10-16

我想弄清楚这两行代码之间的区别。

我们给定'Count'是类名,C1和C2是该类的对象。没有给出如何以及何时声明类的信息。

Count C2(C1); //Statement 1
Count C2=C1;  //Statement 2

没有给出其他信息。复制构造函数的这两行调用有什么区别?如果你有答案,请详细说明。

谢谢!

在语法层面上,第一种称为"直接初始化",第二种称为"复制初始化"。如果Count是类类型(例如,不是int的typedef),则两个版本都同样会导致调用复制构造函数。

第一个版本在任何情况下都有效,如果复制构造函数声明为explicit,则第二个版本不起作用

在语句1中,C2将使用复制构造函数从C1构造自己。
在语句2中,C2将使用复制构造函数从C1构造自己,如果没有可用的复制构造函数,则使用-或-默认构造自己,然后使用C1的赋值操作符为自己赋值。我不认为语句1有这个选项

复制初始化

Count C2=C1; //Statement 2

Copy初始化构造了一个隐式转换序列:它试图将C1转换为Count类型的对象。如果在复制构造函数中使用explicit关键字,则该关键字将被抑制,编译器将发出错误。


直接初始化

Count C2(C1); //Statement 1

直接初始化的行为类似于对Count(包括显式的)构造函数的函数调用,并且参数是传递给被调用构造函数的c1。重载解析将找到最佳匹配的构造函数,并在需要时执行所需的任何隐式转换。

编译器认为它们是相同的。

Count C2 = Count(C1);
Count C2(C1);
Count C2 = C1;

它们都将调用复制构造函数


但是这是不一样的:

Count C2;
C2 = C1;

将使用默认构造函数构造C2,然后使用operator=将C1赋值给它。