转载

C++运算符重载,友元函数

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; }


正文到此结束
本文目录