C++ 析构函数是如何工作的 ;在一个简单的程序中?

C++ 析构函数是如何工作的 ;在一个简单的程序中?,c++,constructor,destructor,C++,Constructor,Destructor,我不理解这个程序的输出: class A { public : A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; A f (A & a) { return a; } int main() { A a ; a = f(a); return 0; } 因为我只创

我不理解这个程序的输出:

class A {
public :
    A()  { cout << "A()"  << endl; }
    ~A() { cout << "~A()" << endl; }
};

A f (A & a) { 
    return a;
}

int main() {
    A a ;
    a = f(a);

    return 0;
}
因为我只创建了一个
A
对象:
A
。然而,输出是有限的

A()
~A()
~A()
A() 
A(const& A) 
returning 0
~A()
~A()
你知道为什么吗


后续问题

好的,无论何时调用
f
,我都会构造一个
a
的副本,因此我有一个对副本构造函数的调用和一个对析构函数的调用

现在我的主要功能是:

int main() {
    A a ;
    A b = f(a);
    cout << "returning 0" << endl;
    return 0;
}
但结果是

A()
~A()
~A()
A() 
A(const& A) 
returning 0
~A()
~A()

这是为什么?

您只显式创建了一个对象,但您在此处创建了一个对象:

A f (A & a) { return a ;} //when returning A
当您复制对象以将其从f传回时,该副本由默认的复制构造函数构造,因为您没有提供。 如果您将您的类更改为:

class A {
public :
    A () { cout << "A() " << endl;}
    A (const A &) { cout << "A(const &) " << endl;}
    ~A () { cout << "~A ()" << endl; }
};
A类{
公众:
答:{cout对后续问题的回答

析构函数与构造函数成对。为什么你期望两个构造函数和三个析构函数?这在一个正确的程序中是不可能的

A b = f(a);
不是赋值(与
a=f(a)
)相反),而是构造()。由于(RVO),您在这里看不到临时对象的构造和销毁:编译器可以删除不必要的副本并像通过
ab(a);
一样构造
b

在C++17之前,此机制是可选的。您可以使用带有
-std=C++11-fno elide构造函数的GCC创建此代码,以发现临时:

A()              construct (a)
A(const A&)      construct a temporary copy of (a)
A(const A&)      construct (b) from that temporary
~A()             destruct that temporary
returning 0 
~A()             destruct (b)
~A()             destruct (a)
由于C++17这种类型的复制省略是强制性的,因此您始终只能看到两种构造和销毁:

A()              construct (a)
A(const A&)      construct (b) from (a)
returning 0 
~A()             destruct (b)
~A()             destruct (a)

尝试添加这一行:
A(const A&){您是否缺少副本构造和副本分配(以及完整的移动操作)。是的,当然,我的错,我修复了答案。谢谢@EvgPablo Yaggi,@Evg后续内容如何?我很难将它们全部放在一起。