对象创建的顺序,cpp

时间:2015-09-06 08:28:19

标签: c++ copy-constructor

如果我有一个对象A,我在一行中创建了两个对象:

A a1 = *(new A);

然后操作顺序如下:

  1. 构建新对象。
  2. 为了创建a1,使用新创建的对象
  3. 调用它的CC

    现在,有多个" ="在一行?

    A a2 = *(new A) = a1;
    

    我在ideone上编译了这段代码并且得到了这里只调用了常规构造函数和=运算符,但没有CC,为什么会这样?

    我认为将会发生的事情是:

    1. 将使用CC on a1
    2. 创建新A.
    3. a2将使用CC on *(new A)
    4. 创建

      你能解释我错过的东西吗?

      编辑:我明白了,谢谢!

2 个答案:

答案 0 :(得分:2)

当编译器遇到这行代码A a2 = *(new A) = a1;时,它就像以下一样:

  1. 调用A的默认构造函数来创建对象A(从中间开始)。

  2. 调用operator =将a1复制到步骤1中创建的新对象中。

  3. 使用步骤2的结果调用复制构造函数来创建a2。

  4. 然而,编译器可能会也可能不会对您的代码进行一些优化,具体取决于其设置的优化级别。

答案 1 :(得分:1)

因为*(new A)已经是构造对象,但复制构造函数调用恰好构造了左侧对象。在这种情况下,它不是必需的,因为L.H.S对象是完全构造的。