为什么默认构造函数是唯一使用的构造函数

Why is the default constructor the only one being used?

本文关键字:构造函数 默认 为什么 唯一      更新时间:2023-10-16

我试着看看这个例子中每个方法何时被调用:

#include <iostream>
using namespace std;
class A {
public:
    int x;
    A(int x) : x(x) {cout<<"default ctor"<<endl;}
    A(const A& a) : x(a.x) {cout<<"copy ctor"<<endl;}
    A& operator =(const A& a) {cout<<"assignment op"<<endl;x=a.x;return *this;}
};
A f() { return A(5); }
int main() {
    A a = f();
}

我希望用语句return A(5)调用复制构造函数,因为只要我知道返回对象时,就会创建并返回临时的副本。此外,在句子A a = f()中,我希望复制构造函数也被调用,因为a正在初始化,给定了另一个A对象。

为什么要打印default ctor

这里有两个优化。返回值优化(RVO)Copy Elision将通过初始化将f()的返回值直接合并到目标变量中。所以这个代码:

A f() { return A(5); }
A a = f();

优化为:

A a(5);

因为在的情况下允许c++编译器跳过operator=

A a = A();
A b = A(a);

并直接使用构造函数。他们还可以执行复制省略的返回值优化。

因此,最终您基本上拥有A a(5);