对象创建顺序,cpp
order of object creation, cpp
如果我有一个对象 A
并且我在一行中创建了 2 个对象,如下所示:
A a1 = *(new A);
那么操作顺序是这样的:
- 新对象构建完成。
- 为了创建 a1,用新创建的对象调用它的 CC
现在,一行中有多个“=”怎么样?
A a2 = *(new A) = a1;
我在 ideone 上编译了这段代码,发现这里只调用了常规构造函数和 = 运算符,但没有调用 CC,这是为什么?
我以为会发生什么:
- 将在 a1 上使用 CC 创建新 A
- a2 将在 *(new A) 上使用 CC 创建
你能解释一下我错过了什么吗?
编辑:知道了,谢谢!
当编译器遇到这行代码 A a2 = *(new A) = a1;
时,它会执行以下操作:
调用A的默认构造函数创建对象A(从中间开始)。
调用 operator= 将 a1 复制到步骤 1 创建的新对象中。
调用复制构造函数以使用步骤 2 的结果创建 a2。
然而,编译器可能会或可能不会对您的代码进行一些优化,具体取决于其设置的优化级别。
因为 *(new A) 已经是一个构造对象,但复制构造函数调用恰好构造了左侧对象。在这种情况下不需要,因为 L.H.S 对象已完全构造。
如果我有一个对象 A
并且我在一行中创建了 2 个对象,如下所示:
A a1 = *(new A);
那么操作顺序是这样的:
- 新对象构建完成。
- 为了创建 a1,用新创建的对象调用它的 CC
现在,一行中有多个“=”怎么样?
A a2 = *(new A) = a1;
我在 ideone 上编译了这段代码,发现这里只调用了常规构造函数和 = 运算符,但没有调用 CC,这是为什么?
我以为会发生什么:
- 将在 a1 上使用 CC 创建新 A
- a2 将在 *(new A) 上使用 CC 创建
你能解释一下我错过了什么吗?
编辑:知道了,谢谢!
当编译器遇到这行代码 A a2 = *(new A) = a1;
时,它会执行以下操作:
调用A的默认构造函数创建对象A(从中间开始)。
调用 operator= 将 a1 复制到步骤 1 创建的新对象中。
调用复制构造函数以使用步骤 2 的结果创建 a2。
然而,编译器可能会或可能不会对您的代码进行一些优化,具体取决于其设置的优化级别。
因为 *(new A) 已经是一个构造对象,但复制构造函数调用恰好构造了左侧对象。在这种情况下不需要,因为 L.H.S 对象已完全构造。