一、赋值运算符重载概念
赋值运算符重载和拷贝构造函数一样,都是C++中6个默认成员函数之一。但是拷贝构造函数是用已存在对象去创建一个新对象,而赋值运算符重载是两个已存在的对象,对象1赋值给对象2。
当我们未显示定义赋值运算符重载时,编译器会自动生成默认的赋值运算符重载。该默认赋值重载运算符对于内置类型是直接赋值的,对于自定义类型会调用该自定义类型的赋值重载运算符。
赋值运算符重载不能重载为全局函数,因为如果重载为全局函数,那么类中一定没有显示定义赋值运算符重载,编译器会生成默认的赋值运算符重载,两个赋值运算符重载会发生冲突。
二、显式定义赋值运算符重载
由于赋值运算符可以进行连续赋值,所以需要返回被赋值的对象。如果返回值类型是Date,返回的不是被赋值的对象,而是该对象的拷贝,又需要调用拷贝构造函数,效率低。所以返回值类型为引用。
为了防止自己赋值给自己,需要加上一个判断 this != &d
//Date类赋值运算符重载
Date& operator=(const Date& d)
{
if (this != &d)
{
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
}
return *this;
}
既然我们不显示定义赋值运算符重载,编译器会自动生成赋值运算符重载,那么为什么我们还要去显式定义呢?
原因和拷贝构造函数一样,编译器自动生成的赋值运算符重载只是以值的方式逐字节拷贝,如果成员变量中有指针变量,那么造成浅拷贝。因此当类中有动态内存申请时,我们需要显式定义赋值运算符重载。