如果我有一个对象A
,我在一行中创建了两个对象:
A a1 = *(new A);
然后操作顺序如下:
现在,有多个" ="在一行?
A a2 = *(new A) = a1;
我在ideone上编译了这段代码并且得到了这里只调用了常规构造函数和=运算符,但没有CC,为什么会这样?
我认为将会发生的事情是:
你能解释我错过的东西吗?
编辑:我明白了,谢谢!
答案 0 :(得分:2)
当编译器遇到这行代码A a2 = *(new A) = a1;
时,它就像以下一样:
调用A的默认构造函数来创建对象A(从中间开始)。
调用operator =将a1复制到步骤1中创建的新对象中。
使用步骤2的结果调用复制构造函数来创建a2。
然而,编译器可能会也可能不会对您的代码进行一些优化,具体取决于其设置的优化级别。
答案 1 :(得分:1)
因为*(new A)已经是构造对象,但复制构造函数调用恰好构造了左侧对象。在这种情况下,它不是必需的,因为L.H.S对象是完全构造的。