【问题标题】:Question regarding C++ Copy Constructor call关于 C++ Copy Constructor 调用的问题
【发布时间】:2011-09-15 19:07:01
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

标签: c++ oop class constructor


【解决方案1】:

在语法层面,第一种称为“直接初始化”,第二种称为“复制初始化”。如果Count 是类类型(例如,不是int 的typedef),那么这两个版本都等效地导致调用复制构造函数。

第一个版本无论如何都可以工作,如果复制构造函数声明为explicit,第二个版本就不起作用。

【讨论】:

  • 很好地参考了人们通常不知道的显式重要语法
【解决方案2】:

在语句 1 中,C2 将使用复制构造函数从 C1 构造自身。
在语句 2 中,C2 将使用复制构造函数从 C1 构造自己,或者 - 如果没有可用的复制构造函数,它将默认构造自己,然后使用 C1 中的赋值运算符来分配自己。我认为语句 1 没有这个选项。

【讨论】:

  • 另外,正如 Als 和 Kerrek SB 所说,存在概念差异。
【解决方案3】:

复制初始化

Count C2=C1; //Statement 2

复制初始化构造一个隐式转换序列:它尝试将C1 转换为Count 类型的对象。如果在复制构造函数上使用了explicit关键字,那么它可以被抑制并且编译器会发出错误。


直接初始化

Count C2(C1); //Statement 1

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

【讨论】:

    【解决方案4】:

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

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

    它们都会调用复制构造函数。


    然而这不一样:

    Count C2;
    C2 = C1;
    

    这将使用默认构造函数构造 C2,然后使用 operator= 将 C1 分配给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多