友员函数可以通过类对象访问类的公、私、保护成员。和类成员函数权限一样
与重载为成员函数不同的是:重载的友元函数不属于任何类,这样操作数都需要通过函数的形参表传递。(前面的双目只需提供一个参数,因为调用对象本身就是一个操作数了)
同样分为双目运算和单目运算来讨论。
双目运算符
如类A “+”重载为其友员函数。对象a+b相当于 operator+(a,b)
单目运算符
以前置和后置“++”为例
前置++a 相当于operator++(a)
后置a++ 相当于operator++(a,0) //0同样是为区分,无实际意义
#include<iostream.h>
//using namespace std; //vc6.0运程异常,注释后运行通过
class Time
{
public:
Time(int h=0,int m=0); //默认参数值
friend Time operator+(Time t1,Time t2); //重载为类的友员函数
int GetH(){return m_hour;}
int GetM(){return m_minute;}
void showTime();
private:
int m_hour,m_minute;
};
Time::Time(int h,int m)//默认参数不能在函数声明和实现中同时出现
{
h+=m/60;
m%=60;
m_hour=h;
m_minute=m;
}
Time operator +(Time t1,Time t2) //和上例基本相同,区别只重载为友元函数,有两个操作数
{
int newH,newM;
newM=t1.m_minute+t2.m_minute;
newH=t1.m_hour+t2.m_hour;
newH+=newM/60;
newM%=60;
newH%=24;
return Time(newH,newM);
//看似对构造函数的调用,实际是构造一个临时对象并返回到主函数中
}
void Time::showTime()
{
cout<<m_hour<<"时"<<m_minute<<"分"<<endl;
}
int main()
{
Time t1(15,51),t2(10,30);
Time t3=t1+t2;
t3.showTime();
return 0;
}
//2时21分
//Press any key to continue