当数组中的元素被赋值时,为什么不调用析构函数


#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"ctor called"<<endl;
}
~A()
{
cout<<"Destructor called"<<endl;
}
A& operator=(const A &a)
{
cout<<"Copy assignment operator called"<<endl;
return *this;
}
};
int main()
{
A a;
A aa[2];
aa[0] = a;
}

调用3次默认构造函数;调用1次复制分配运算符;调用了3次析构函数。

问题:析构函数不应该调用4次吗?

不,析构函数应该被调用三次。

A类型有三个对象:

  • 一个变量a
  • 数组变量aa的两个元素

没有其他类型为A的对象,既不是变量也不是临时对象。

分配不会创建任何对象。行aa[0] = a;不创建任何新的A对象。它只是调用您定义的Aoperator=重载。

由于有三个类型为A的对象,因此应该有三个对A的析构函数的调用,A类型的每个对象一个。

析构函数不应该调用4次吗?

不,析构函数不应该被调用4次,因为您只构造了3次对象,您得到了相应的3个析构函数调用。

看起来您正在期待一个对应于赋值aa[0] = a;的析构函数调用。但指定并不涉及创建新对象。更准确地说,您正在执行复制分配,而不是副本初始化

特别是,您的分配语句as[0] = a;与相同

aa[0].operator=(a); //this involves no construction of any new objects

在上面的语句中,没有创建任何新对象。因此,只有三个A对象可以得到3个构造函数和3个析构函数调用。

最新更新