C++运算符重载函数和友元函数是一起的,所以一起写
C++运算符重载函数
C++允许运算符重载,带来了很多的便利
下面的是一个代码例子(从代码里面上,我们可以两个类相加,实现其特定功能)
代码:
#include<iostream>
using namespace std;
class Timer
{
private:
int minute;
int hour;
public:
Timer(int minute, int hour)
{
this->minute = minute;
this->hour = hour;
}
Timer()
{
minute = 0;
hour = 0;
}
Timer operator+(const Timer &t);
void show();
};
Timer Timer::operator+(const Timer &t) //重载加号运算符
{
Timer sum;
int total = 60*(t.hour + hour) + t.minute + minute;
sum.minute = total % 60;
sum.hour = total / 60;
return sum;
}
void Timer::show()
{
cout << this->hour << " " << this->minute << endl;
}
int main()
{
Timer a(59, 5);
Timer b(58, 4);
Timer sum = a + b; // 使用运算符重载函数,等价于 a.operator+(b);
sum.show();
return 0;
}
3我们可以实现 Timer sum = a * 2.3;这又带来了另外一个问题,如果我们要实现 Timer sum = 2.3 * a (a为timer类)
非成员函数可以做到这一点
对于成员函数,左操作数是调用对象,而右操作数是函数参数
对于非成员函数,左操作数是函数的第一个参数,右操作数是函数的第二个参数
Timer sum = a * 2.3
对于成员函数,相当于 Timer sum = a.operator +(2.3);
对于非成员函数,相当于Timer sum = operator(a, 2.3); 所以非成员函数可以实现 Timer sum = 2.3 * a;
但是,又出现了一个问题,如果我们要访问a的private数据,非成员函数实现就不行了,所以友元函数出现了
解决了这个局面
1:友元函数不是成员函数,不能使用成员运算符调用
2:友元函数虽然不是成员函数,但是可以访问类的private数据
代码中我吧show函数给删除了,用了有缘重载<<函数,这就体现了重载函数的强大!
代码:
#include<iostream>
using namespace std;
class Timer
{
private:
int minute;
int hour;
public:
Timer(int minute, int hour)
{
this->minute = minute;
this->hour = hour;
}
Timer()
{
minute = 0;
hour = 0;
}
friend Timer operator*(int mulitiple, const Timer &a);
friend ostream& operator <<(ostream &cout, const Timer &a);
};
ostream & operator <<(ostream &os, const Timer &a) //const对象只能调用const成员函数
{
os << a.minute << " " << a.hour << endl;
return os;
}
Timer operator*(int multiple, const Timer &a) //重载乘号运算符
{
Timer sum;
int total = multiple * a.minute + multiple * a.hour * 60;
sum.minute = total % 60;
sum.hour = total / 60;
return sum;
}
int main()
{
Timer a(59, 5);
Timer sum = 3 * a; // 使用友元函数,operator *(3, a);
cout << sum ; //使用友元函数
return 0;
}