为什么不调用复制构造函数,但在此代码中调用默认构造函数

Why copy-constructor is not called but default constructor is invoked in this code?

本文关键字:构造函数 调用 代码 默认 复制 为什么不      更新时间:2023-10-16

我知道,当从已经存在的对象创建对象以及函数按值返回对象时,将调用复制构造函数。那么为什么在下面的代码中不调用复制构造函数而是调用默认构造函数呢?

class A {
public:
    A() { cout << "A" << endl; }
    A(A &) { cout << "A&" << endl; }
    A(const A &) { cout << "const A&" << endl; }
};
A fun() {
    class A a;
    return a;
}
int main() {
    class A a = fun(); // output: A
}

简短的回答:编译器优化。

  • 首先,函数中的a对象直接在main函数的作用域中创建,以避免通过函数的返回将本地参数复制(或移入 C++11)函数范围。这就是返回值优化

  • 然后,在 main 中,语句变得等效于 class A a = A()并且再次允许编译器就地创建a对象,而无需从临时对象复制。这是复制省略

即使复制构造函数(完全绕过)有副作用,这也是允许的,如您的示例所示。