我看了一下这个演示文稿,并在幻灯片379上显示了以下代码(进行了一些小的更改):
#include <iostream>
using namespace std;
struct A
{
A() { cout << "A()" << endl; }
A(int v) { cout << "A(int)" << endl; }
~A() { cout << "~A()" << endl; }
};
struct X
{
X(int v) { a = v; }
X(long v) : a(v) {}
A a;
};
int main()
{
cout << "bad style:" << endl;
{ X slow(int(2)); }
cout << "good style:" << endl;
{ X fast(long(2)); }
}
输出为:
bad style:
A()
A(int)
~A()
~A()
good style:
A(int)
~A()
(此代码在我的计算机上运行,使用g ++编译)
现在,我理解了为什么构造函数会以错误的样式被调用两次,但是为什么析构函数会这样做呢?
X(int v) { a = v; }
// ^^^^^
带下划线的线是作业。有没有operator=
接受一个int
(v
),但有一个隐含的转换,从int
到A
。因此,将A
构造一个临时类型的对象,并将其传递给编译器为您生成的赋值运算符。稍后它会被销毁(在最终创建完整表达式之后),并且还有您没想到的第二个析构函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句