C++操作符重载和友元函数

C++ 专栏收录该内容
55 篇文章 1 订阅

重载操作符

假设你早上花了3小时五分钟学习,下午花了五小时十八分钟来玩,则总共花了多少时间?或许你觉得这就是简单的加法,但是计算机可没有你这么聪明,相加的单位为小时与分钟的混合,与内置类型不匹配。所以接下来就要用到我们的操作符重载。
先定义一个Time类

class Time
{
	private:
		int hours;
		int minutes;
	public:
		Time();
		Time(int h,int m=0);
		Time operator+(const Time & t) const;
		void show() const;
}

operator+即为重载+号操作符方法

Time::Time()
{
	hours=0;
	minutes=0;
}
Time::Time(int h,int m)
{
	hours=h;
	minutes=m;
}
Time Time::operator+(const Time & t)const
{
	Time sum;
	sum.minutes=minutes+t.minutes;
	sum.hours=hours+t.hours+sum.minutes/60;
	sum.minutes%=60;
	returun sum;
}
void Time::show() const
{
	std::cout<<hours<<"xiaoshi"<<minutes<<endl;
}

operator+()也是由Time对象调用的,它将第二个Time对象作为参数,并返回一个Time对象。
调用如下:
total = time1.operator+(time2);
或者
total=time1+time2;

重载限制

  • 重载后的运算符必须只要有一个个操作数是用户定义的类型,防止用户为标准类型重载运算符。(我的理解是防止有人无聊把两个double的相加重载为两个double的相减)

  • 使用运算符不能违反原来运算符的规则,比如不能把"a/b"重载为"/b"

  • 不能创建新运算符,如operator**()

  • 大部分运算符可以通过成员或非成员函数进行重载,但是下列运算符只能通过成员函数进行重载

  • =:赋值运算符

  • ():函数调用运算符

  • []:下标运算符

  • ->:通过指针访问类成员的运算符

友元

通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
接下来讲讲为什么需要友元,成员函数不香吗。在为类重载二元运算符时(带有两个参数的运算符)常常用到友元。
在前面Time类的实例中,重载的乘法运算符和加法的差别在于,它使用了两种不同的类型。也就是说加法是结合两个Time值,而乘法是将一个Time和一个double组合。这限制了该运算符的使用方式。记住左侧的操作数是调用对象。
A=B2.75;
将被转化为
A=B.operator
(2.75);
但是下面的语句呢
A=2.75B;
从概念上说2.75
B和B2.75相同。但第一个表达式不对应于成员函数,因为2.75不是Time类的对象。
所以接下来要用非成员函数,大多数运算符都可以通过成员或非成员函数来重载。非成员函数不是对象调用的。
A=2.75
B;
与下面的非成员函数匹配
A=operator*(2.75,B);
该函数原型如下
Time operator*(double m,con Time & t);
但是,问题又来了,非成员函数不能访问类的私有数据,所以,友元来了

friend Time operator*(double m,con Time & t);

1.将上面这个函数原型放在类声明中,并加上friend
2.虽然是在类中声明的函数,但是不是成员函数,所以不能使用成员运算符调用。
3.虽然不是成员函数,但是访问权限和成员函数相同
4.因为不是成员函数,所以不要使用Time::限定符

Time operator*(double m,const Time & t)
{
	return t*m;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:撸撸猫 设计师:马嘣嘣 返回首页

打赏作者

baixiaofei567

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值