#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
对象。它只是调用您定义的A
的operator=
重载。
由于有三个类型为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个析构函数调用。