重載的基本概念
在非面向對象的過程化語言中,要不每個過程或函數(shù)必須具有惟一的調用名,否則會導致編譯錯誤。面向對象程序設計語言提供使用同一函數(shù)名的機制,通過參數(shù)個數(shù)的不同或類型的不同來選擇使用相應的代碼,這就是的函數(shù)的重載。
重載函數(shù)可分為
1) 參數(shù)個數(shù)不同的重載
2) 參數(shù)類型不同的重載
3) 參數(shù)順序不同的重載
運算符重載
C++語言允許程序員重新定義已預定義的運算符,使其能按用戶的要求具有新的含義,這就是所謂的運算符重載。
運算符重載的格式
運算符重載的形式有兩種:重載為類的成員函數(shù)和重載為類的友元函數(shù)
運算符重載為類的成員函數(shù)的語法形式如下:
<函數(shù)類型> operator <被重載的運算符><形參表>
{
<函數(shù)體>;
}
運算符重載為類的友元函數(shù)的語法形式如下:
friend <函數(shù)類型> operator <被重載的運算符><形參表>
{
<函數(shù)體>;
}
一般來講,單目運算最好重載為成員函數(shù),而雙目運算符則最好重載為友元函數(shù)。
重載為成員函數(shù)
例:
#include<iostream.h>
class Time
{
private:
?int hours,minutes,seconds;
public:
?Time()
?{
??hours=0;minutes=0;seconds=0;
?}
?Time(int h, int m, int s)
?{
??hours=h; minutes=m; seconds=s;
?}
?Time operator +(Time &);
?void gettime();
};
Time Time::operator +(Time & time)
{
?int h,m,s;
?s=time.seconds+seconds;
?m=time.minutes+minutes;
?h=time.hours+hours;
?Time result(h,m%60,s%60);
?return result;
}
void Time::gettime()
{
?cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main()
{
?Time t1(8,51,40),t2(4,15,30),t3;
?t3=t1+t2;
?t3.gettime;
}
操作符重載為友元函數(shù)形式
#include<iostream.h>
class Time
{
private:
?int hours,minutes,seconds;
public:
?Time(){ hours=0; minutes=0; seconds=0; }
?Time(int h, int m, int s)
?{
??hours=h; minutes=m, seconds=s;
?}
?friend Time operator +(Time &, Time &);
?void gettime();
};
Time operator +(Time &time1, Time &time2)
{
?int h,m,s;
?s=time1.seconds+time2.seconds;
?m=time1.minutes+time2.minutes+s/60;
?h=time1.hours+time2.hours+m/60;
?Time result(h,m%60,s%60);
?return result;
}
void Time::gettime()
{
?cout<<hours<<":"<<minutes<<":"<<seconds<<endl;
}
void main()
{
?Time t1(8,51,40),t2(4,15,30),t3;
?t3=t1+t2;
?t3.gettime();
}
何時應該用成員函數(shù),何時用友元函數(shù)來訪問類的私有部分。
這地是要注意的地方:
(1)構造函數(shù)、析構函數(shù)和虛函數(shù)運算必須用成員函數(shù);
(2)若運算符的操作需要修改類對象在狀態(tài),則它應該是成員函數(shù),而不是友元函數(shù);
(3)需要左值操作數(shù)的運算符(如:=、+=、++)的重載最好用成員函數(shù);
(4)如果運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望在隱式類型轉換,則該運算符重載必須用友元,而不是成員函數(shù);
(5)不能用友元函數(shù)重載的運算符有:=;();[];->,其余運算符都可以使用友元來實現(xiàn)重載。