【发布时间】:2019-08-18 18:18:16
【问题描述】:
当使用匿名对象初始化数组时,析构函数显示有效值,但我用对象创建了一个数组,覆盖复制构造函数不调用,并且析构函数显示垃圾值。
我尝试通过显示值来理解这一点,但仍然感到困惑。
class Check{
private:
int a;
public:
Check()
{
this->a = 9999;
cout << "\n Default Constructor Called \n";
}
Check(int i)
{
this->a = i;
}
Check(const Check & obj)
{
cout << "COPY CONSTRUCTOR\n";
}
~Check()
{
cout << this->a<<" DESTRUCTOR \n";
}
};
Check b[2] = {Check(5),Check(4)};
Check obj1(2);
Check obj2(3);
Check a[2] = {obj1,obj2};
我期待“COPY CONSTRUCTOR”输出 4 次,但它只有两次并且没有垃圾值。实际输出如下:
COPY CONSTRUCTOR COPY CONSTRUCTOR 32649 DESTRUCTOR -1330935392 DESTRUCTOR 3 DESTRUCTOR 2 DESTRUCTOR 4 DESTRUCTOR 5 DESTRUCTOR
【问题讨论】:
-
垃圾值是因为在复制构造函数中你没有初始化
this->a -
@M.M 你能告诉我为什么复制构造函数只被调用了 2 次吗?
-
在每个构造函数中打印
a的值,你就会明白为什么了。 -
@EtiennedeMartel 为什么在这种情况下没有调用复制构造函数:Check b[2] = {Check(5),Check(4)};"
-
@usaamw141 这被称为copy elision。对象直接在那里构造,从不复制
标签: c++