我正在试图找出这两行代码之间的区别..
我们给出'Count'是我们的类名,C1和C2是该类的对象。没有提供关于如何以及何时宣布课程的信息。
Count C2(C1); //Statement 1
Count C2=C1; //Statement 2
没有提供其他信息。复制构造函数的这两行调用有什么区别?请详细说明您是否有答案。
谢谢!
答案 0 :(得分:4)
在语法层面,第一个称为“直接初始化”,第二个称为“复制初始化”。如果Count
属于类类型(即不是int
的typedef,比如说),则两个版本等效地导致复制构造函数被调用。
第一个版本在任何情况下都有效,如果复制构造函数被声明为explicit
,则第二个版本不起作用。
答案 1 :(得分:1)
复制初始化
Count C2=C1; //Statement 2
复制初始化构造隐式转换序列:它尝试将C1
转换为Count
类型的对象。如果在复制构造函数上使用explicit
关键字,则可以将其抑制,并且编译器将发出错误。
直接初始化
Count C2(C1); //Statement 1
直接初始化的行为类似于对Count
(包括显式的)构造函数的函数调用,并且参数是c1
传递给被调用的构造函数。重载决策将找到最佳匹配构造函数,并在需要时执行任何隐式转换。
答案 2 :(得分:1)
在语句1中,C2将使用复制构造函数从C1构造自己 在语句2中,C2将使用复制构造函数从C1构造自身 - 或 - 如果没有可用的复制构造函数,它将默认构造自身,然后使用C1中的赋值运算符来分配自身。我认为声明1不具备该选项。
答案 3 :(得分:0)
编译器将它们视为相同。
Count C2 = Count(C1);
Count C2(C1);
Count C2 = C1;
他们都将调用复制构造函数。
然而这不一样:
Count C2;
C2 = C1;
这将使用默认构造函数构造C2,然后使用operator=
将C1分配给它。