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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值