【C++】类和对象——运算符operator重载

operator重载 —— 运算符篇

概念

运算符重载和操作符重载的方式类似,都是用operator + 重载的操作符

特性

此处类比两种运算符看才能看得懂注意事项里的表达逻辑

复合赋值运算符

如:+=-=前置++后置++
注意事项
  1. 不能用const修饰传入参数
    • 因为要改变变量的值
  2. 最好传引用,返回类型为引用
    • 因为要改变变量本身,所以最终返回的值就是变量本身
    • 不仅要返回运算的结果,还要赋值给变量,因此直接返回该对象的引用

算数运算符

如:+-*
注意事项
  1. 返回的类型不能是引用
    • 原因:返回的值一般是由该函数中创建的变量提供,此变量的生命周期和函数一样,因此一旦出了函数,变量就会销毁,如果返回该变量的引用,就会导致悬空引用。再者,返回类型是引用的话,不会调用拷贝构造生成临时变量。

日期类代码示例

获取每个月的天数

int GetMonthDay(int year, int month)
{
	// 用static修饰数组为静态数组,整个生命周期只用开辟一次
	static int a[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	if (month == 2 && ((year % 4 == 0 && year % 100 ! = 0) || (year % 400 == 0)))
		return 29;
		
	return a[month];
}

复合赋值运算符

+=操作符重载(日期 + 天数)
class Date
{
	// ...
	Date& operator+=(int day)
	{
		_day += day;
		while (_day > GetMonthDay(_month))
		{
			_day -= GetMonthDat(_month);
			_month++;
			if (_month == 13)
			{
				_month == 1;
				_year += 1;
			}
		}
		return *this;
	}
}
-=(日期 - 天数)
class Date
{
	// ...
	Date& operator(int day)
	{
		_day -= day;
		while (_day < 1)
		{
			--_month;
			if (_month < 1)
			{
				_month == 12;
				--_yera;
			}
			_day += GetMonthDay(_year, _month);
		}
	
		return *this;
	}
}
-=(日期 - 日期)
class Date
{
	int operator-=(const Date& d)
	{
		Date maxDate = *this;
		Date minDate = d;
		if (*this < d)
		{
			maxDate = d;
			minDate = *this;
		}
		
		int count = 0;
		while (minDate ! = maxDate)
		{
			++minDate;
			++count;
		}
		return count;
	}
};

算数运算符

+(日期 + 天数)
class Date
{
	Date operator+(day) const
	{
		Date tmp = *this;
		return tmp += day;
	}
};

-(日期 - 天数)
class Date
{
	Date operator-(int day) const
	{
		Date tmp = *this;
		return tmp -= day;
	}
};
-(日期 - 日期)
class Date
{
	int operator(int day)
	{
		Date tmp = *this - day;
		return tmp;
	}
};

++类运算符

前置++不用传参,后置++的参数类型规定传int,但是不需要定义变量

前置++
Date operator++();

后置++
Date operator++(int);

前置++
class Date
{
	operator++()
	{
		return *this += 1;
	}
}
后置++
class Date
{
	Date operator++(int)
	{
		Date tmp = *this;
		*this += 1;
		return tmp;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值