对象创建顺序,cpp

order of object creation, cpp

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

A a1 = *(new A);

那么操作顺序是这样的:

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

现在,一行中有多个“=”怎么样?

A a2 = *(new A) = a1;

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

我以为会发生什么:

  1. 将在 a1 上使用 CC 创建新 A
  2. a2 将在 *(new A) 上使用 CC 创建

你能解释一下我错过了什么吗?

编辑:知道了,谢谢!

当编译器遇到这行代码 A a2 = *(new A) = a1; 时,它会执行以下操作:

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

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

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

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

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