有关C ++ Copy Constructor调用的问题

时间:2011-09-15 19:07:01

标签: c++ oop class constructor

我正在试图找出这两行代码之间的区别..

我们给出'Count'是我们的类名,C1和C2是该类的对象。没有提供关于如何以及何时宣布课程的信息。

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

没有提供其他信息。复制构造函数的这两行调用有什么区别?请详细说明您是否有答案。

谢谢!

4 个答案:

答案 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分配给它。