1、赋值运算符重载 ——格式
//(1)参数类型:const Date& ,引用传参可以提高传参效率。
//(2)返回值类型:Date& , 引用返回可以提高返回的效率,有返回值的目的是为了支持连续赋值
//(3)检测是否自己给自己赋值
//(4)返回 *this : 要复合连续赋值的含义。
#include <iostream>
using namespace std;
class Date
{
public:
//构造函数会频繁调用,所以放在类里面定义作为 inline
Date(int year = 1, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//赋值运算符重载
//d3=d1;
Date& operator=(const Date& d) //用引用传参,减少拷贝
{
if (this != &d) //防止自己给自己赋值
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this; //出了函数的作用域,*this并没有被销毁,因此可以用传引用返回。
}
private:
int _year;
int _month;
int _day;
};
void TestDate1()
{
Date d1(2022, 7, 24);
//Date d2(d1); //拷贝构造,d2还未创建好
Date d3(2022, 8, 24);
d3 = d1; //赋值运算符重载,d3已经创建好
//相当于:d3.operator=(&d3,d1);
/*Date d4;
d4 = d3 = d1;
d4 = d4;*/
}
int main()
{
TestDate1();
return 0;
}
2、在类中未显式定义时,编译器自动生成的默认赋值运算符重载
//当我们没写赋值运算符重载时,编译会自动生成一个默认赋值运算符重载。(对于内置类型成员变量来说,会逐字节进行赋值;
//而对于自定义类型成员变量来说,需要调用它自己的赋值运算符重载完成赋值。)
//(这一点与拷贝构造一致)
//(1)不需要写的类型:A、日期类(都是内置类型成员变量); B、My Queue类(自定义类型成员变量st1,st2;会去调用它们的赋值运算符重载)(前提条件是Stack类需要写赋值运算符重载)
//(2)需要写的类:Stack类——因为内置类型成员变量: DateType* _array 逐字节赋值之后, 两个 _array指向同一个空间(造成两个栈操作同一个空间)
// ( 对于Stack类而言,值拷贝无法实现,需要运用深拷贝去解决。)
// Stack st1;
// Stack st2;
// st2.Push(1);
// st2.Push(2);
// st1 = st2;
3、MyQueue类的知识总结
// My Queue类 实现躺赢 —— 构造、拷贝构造、赋值重载以及析构 的默认生成都可以使用 {前提条件是 My Queue类的自定义类型成员变量的类Stack
// 都写了构造、拷贝构造、赋值重载以及析构 函数}。
// class MyQueue
// {
// private:
// Stack _st1;
// Stack _st2;
// };