C++中拷贝构造函数和赋值运算符重载函数何时调用?
先看下面的程序:
#include <iostream>
using namespace std;
class D
{
public:
D()
{
cout<<"调用D的无参构造函数"<<endl;
}
D(const D &d)
{
cout<<"调用D的拷贝构造函数"<<endl;
}
D & operator=(const D &d)
{
cout<<"调用D的赋值运算符重载函数"<<endl;
return *this;
}
virtual ~D()
{
cout<<"调用D的析构函数"<<endl;
}
};
//这个辅助函数传进来的对象会复制一个副本,调用拷贝构造函数,返回时也会生成一个临时对象,调用拷贝构造函数,函数执行完成后还要调用两次析构函数
D fun(D d)
{
cout<<"辅助函数"<<endl;
return d;
}
int main()
{
D d; //调用D的构造函数
D dd = fun(d);
}
输出结果:
调用D的无参构造函数
调用D的拷贝构造函数
辅助函数
调用D的拷贝构造函数
调用D的析构函数
调用D的析构函数
调用D的析构函数
请按任意键继续. . .
再看下面的程序:
#include <iostream>
using namespace std;
class D
{
public:
D()
{
cout<<"调用D的无参构造函数"<<endl;
}
D(const D &d)
{
cout<<"调用D的拷贝构造函数"<<endl;
}
D & operator=(const D &d)
{
cout<<"调用D的赋值运算符重载函数"<<endl;
return *this;
}
virtual ~D()
{
cout<<"调用D的析构函数"<<endl;
}
};
//这个辅助函数传进来的对象会复制一个副本,调用拷贝构造函数,返回时也会生成一个临时对象,调用拷贝构造函数,函数执行完成后还要调用两次析构函数
D fun(D d)
{
cout<<"辅助函数"<<endl;
return d;
}
int main()
{
D d , dd; //调用D的构造函数
dd = fun(d);
}
输出结果:
调用D的无参构造函数
调用D的无参构造函数
调用D的拷贝构造函数
辅助函数
调用D的拷贝构造函数
调用D的析构函数
调用D的赋值运算符重载函数
调用D的析构函数
调用D的析构函数
调用D的析构函数
请按任意键继续. . .
一句话总结:拷贝构造函数只用来初始化新对象,即还未初始化的对象。而赋值操作符只施行于已初始化的对象上。