运算符重载&const修饰符

发布时间 2023-06-03 16:21:34作者: 智子lock

运算符重载

运算符重载一般作为类的成员函数实现,用于实现自定义类的运算操作。

[返回值] operator[运算符](参数...){...};

参数

  • 参数个数必须与运算符原意需要的参数相同,比如重载+,就需要两个参数(左参数和右参数)
  • 对于单目运算符,不需要传入参数,以为已经默认将成员this指针指向的对象作为参数传入
  • 对于双目运算符,只需要传入一个参数做为右参数,左参数已经默认为this指针指向的对象

返回值

返回值的类型取决于重载的运算符的作用

应用

设计一个时间类,重载+号使得两个时间相加显示正确的时间

class Time
{
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	void Print()
	{
		cout << _hour << ":" << _min << ":" << _sec << endl;
		
	}
	Time operator+(int min)//加分钟
	{
		 Time t(*this);//因为是+号,规定不能改变左右参数的值,所以使用t来取和用以返回。
		 t._min += min;
		 if (t._min > 59)//检查时间正确性
		 {
			 t._hour += (t._min / 60);
			 if (t._hour > 23)
				 t._hour /= 24;
			 t._min %= 60;
		 }
		 return t;
	}
};
int main()
{
	Time a(10, 30, 30);
	(a + 140).Print();
    return 0;
}

流提取>>与流插入<<

因为流运算符是双目运算符,所以this指针指向的类应该放在运算符左边,流对象应该放在运算符右边,但这与我们实际使用的场景刚好相反。
我们需要让左参数指向流,右参数指向类,因此重载就不能做为类的成员函数出现了。此时,需要用到友元函数friend,友元函数本身是一个普通函数,但作为类的友元,能够调用类的成员,包括private。并且参数不用被类限制为第一个必须是this指向的指针。

#include"head.h"
class Time
{
	friend ostream& operator<<(ostream& out, Time& t);//友元函数,声明
	friend istream& operator>>(istream& in, Time& t);
	int _hour;
	int _min;
	int _sec;
public:
	Time(int hour = 0, int min = 0, int sec = 0)
	{
		_hour = hour;
		_min = min;
		_sec = sec;
	}
	
};
ostream& operator<<(ostream& out, Time& t)//流插入
{
	out << t._hour << ":" << t._min << ":" << t._sec << endl;
	return out;
}
istream& operator>>(istream& in, Time& t)//流提取
{
	in >> t._hour >> t._min >> t._sec;
	return in;
}
int main()
{
	Time a;
	cin >> a;
	cout << a;
	return 0;
}