天天看点

四十七、多态性:运算符重载为类的友元函数

友员函数可以通过类对象访问类的公、私、保护成员。和类成员函数权限一样
	与重载为成员函数不同的是:重载的友元函数不属于任何类,这样操作数都需要通过函数的形参表传递。(前面的双目只需提供一个参数,因为调用对象本身就是一个操作数了)
同样分为双目运算和单目运算来讨论。
双目运算符
如类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