运算符重载
运算符重载一般作为类的成员函数实现,用于实现自定义类的运算操作。
[返回值] 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;
}
标签:const,hour,min,int,修饰符,运算符,sec,参数
From: https://www.cnblogs.com/starkly/p/17453922.html