先看一个实例:
#include<iostream>
using namespace std;
class Demo
{
public:
//构造函数
Demo(int num)
{
m_num = num;
printf("constructor\n");
}
//拷贝构造函数
Demo(const Demo & demo)
{
m_num = demo.m_num;
printf("copy constructor\n");
}
//赋值运算符重载
Demo& operator=(const Demo& demo)
{
m_num = demo.m_num;
printf("operator=\n");
return *this;
}
//析构函数
~Demo()
{
cout<<"destructor\n";
}
private:
int m_num;
};
int main()
{
Demo A(100); // 产生一个实例,调用一次构造函数
Demo B=A; // 调用拷贝构造函数,产生一个实例
Demo C(20); // 产生一个实例,调用一次构造函数
C = A; // 调用赋值运算符重载
return 0;
}
运行结果:三次构造三次析构
在默认情况下(用户没有定义,但是也没有显示的删除),编译器会自动隐式生成一个拷贝构造函数和赋值运算符,但用户在新标准中可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算
调用时机:
1)调用拷贝构造函数:创造一个新对象时(包括传参产生的临时对象和创建对象)
2)调用赋值运算符:对象已经产生