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