天天看點

四十七、多态性:運算符重載為類的友元函數

友員函數可以通過類對象通路類的公、私、保護成員。和類成員函數權限一樣
	與重載為成員函數不同的是:重載的友元函數不屬于任何類,這樣操作數都需要通過函數的形參表傳遞。(前面的雙目隻需提供一個參數,因為調用對象本身就是一個操作數了)
同樣分為雙目運算和單目運算來讨論。
雙目運算符
如類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