C++ 对象创建顺序,cpp

C++ 对象创建顺序,cpp,c++,copy-constructor,C++,Copy Constructor,如果我有一个对象A,我在一行中创建了两个对象,如下所示: A a1 = *(new A); 那么操作顺序是这样的: 构造新对象 为了创建a1,使用新创建的对象调用它的CC 现在,在一行中有多个“=”怎么样 A a2 = *(new A) = a1; 我在ideone上编译了这段代码,发现这里只调用了常规构造函数和=运算符,但没有CC,这是为什么 我认为将会发生的是: 将使用a1上的CC创建新A a2将使用CC on*创建(新A) 你能解释一下我遗漏了什么吗 编辑:我知道了,谢谢 当编译器遇到

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

A a1 = *(new A);
那么操作顺序是这样的:

  • 构造新对象
  • 为了创建a1,使用新创建的对象调用它的CC
  • 现在,在一行中有多个“=”怎么样

    A a2 = *(new A) = a1;
    
    我在ideone上编译了这段代码,发现这里只调用了常规构造函数和=运算符,但没有CC,这是为什么

    我认为将会发生的是:

  • 将使用a1上的CC创建新A
  • a2将使用CC on*创建(新A)
  • 你能解释一下我遗漏了什么吗


    编辑:我知道了,谢谢

    当编译器遇到这行代码时
    a2=*(新的A)=a1它的作用如下:

  • 调用A的默认构造函数来创建对象A(从中间)

  • 调用操作符=将a1复制到步骤1创建的新对象中

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


  • 但是,编译器可能会也可能不会对代码进行某些优化,这取决于其设置的优化级别。

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

    两个示例都像筛子一样泄漏内存。没有人会在现实世界中编写这样的代码,这样的询问对我来说是毫无用处的。@πάνταῥεῖ 我基本上同意。但是有人可能会重载全局新操作符(但如果他们这样做了,这仍然是愚蠢的语法使用)好吧,这是一个糟糕的代码,但我仍然对调用=而不是=的原因感兴趣CC@CIsForCoocckiesoperator=和CC不一定是同一个函数。@cisforcoockies第二个函数调用赋值运算符,因为在那个序列点上,它不再是初始化的一部分。@cisforcoockies这很少见。我刚刚测试了代码,并按照描述工作。我使用了Visual Studio 2013。我得到了一个运算符=后跟一个副本构造函数。我找不到我以前编写的代码,所以我相信你的话:)thx