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后续内容如何?我很难将它们全部放在一起。