为什么实例化对象时会调用构造函数两次

mad*_*ada -2 c++ oop constructor class

根据我的理解,我知道当一个对象被实例化时,构造函数被调用一次。但我不明白为什么两个构造函数都被调用而只有一个对象被实例化

#include <iostream>
using namespace std;
#define print(me) cout << me << endl;

class A 
{
    public:
    A() { print("default called"); }
    A(int x) { print("paramterized called"); }
};


int main()
{
    A a;
    a = A(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到输出:默认调用参数化调用

Vla*_*cow 5

在这些行中

A a;
a = A(10);
Run Code Online (Sandbox Code Playgroud)

创建了两个 A 类型的对象。第一个是使用默认构造函数在声明中创建的

A a;
Run Code Online (Sandbox Code Playgroud)

第二个是在表达式 A( 10 ) 中创建的临时对象

a = A(10);
Run Code Online (Sandbox Code Playgroud)

然后使用复制赋值运算符将其分配给已经存在的对象a

由于复制省略,您可以通过最初编写来避免使用默认构造函数

A a = A( 10 );
Run Code Online (Sandbox Code Playgroud)

事实上,由于复制省略,它相当于

A a( 10 );
Run Code Online (Sandbox Code Playgroud)

前提是复制构造函数未声明为显式。