类与对象——赋值运算符重载

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;
//  };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值