所謂重載,就是重新賦予新的含義。函數重載就是對一個已有的函數賦予新的含義,使之實現新功能。
運算子也可以重載
運算子多載是對已有的運算子賦予多重含義
必要性
C++中預定義的運算子其運算對象只能是基礎資料型別 (Elementary Data Type),而不適用於使用者自訂類型(如類)
(一) C++不允許使用者自己定義新的運算子,只能對已有的C++運算子進行重載。
(二) C++允許重載的運算子C++中絕大部分的運算子允許重載.
不能重載的運算子只有5個:
(1) 成員訪問運算子.
(2) 範圍運算子∷
(3) 條件運算子?:
(4) 成員指標運算子*
(5) 編譯預先處理命令的開始符號#
(三) 重載不能改變運算子運算對象(即運算元)的個數。
(四) 重載不能改變運算子的優先順序別。
(五) 重載運算子的函數不能有預設的參數,否則就改變了運算子參數的個數,與前面第(3)點矛盾。
(六) 重載的運算子必須和使用者定義的自訂類型的對象一起使用,其參數至少應有一個是類對象(或類對象的引用)。也就是說,參數不能全部是C++的標準類型,以防止使用者修改用於標準類型資料的運算子的性質。
(七) 用於類對象的運算子一般必須重載,但有兩個例外,運算子“=”和“&”不必使用者重載。
① 賦值運算子(=)可以用於每一個類對象,可以利用它在同類對象之間相互賦值。
② 地址運算子&也不必重載,它能返回類對象在記憶體中的起始地址。
總之,當C++語言原有的一個運算子被重載之後,它原先所具有的語義並沒有消失,只相當於針對一個特定的類定義了一個新的運算子。
運算子多載可以使用成員函數和友元函數兩種形式。可以參考以下的經驗:
(1)只能使用成員函數重載的運算子有:=、()、[]、->、new、delete。
(2)單目運算子最好重載為成員函數。
(3) 對於複合的賦值運算子如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建議重載為成員函數。
(4) 對於其它運算子,建議重載為友元函數。
運算子多載的方法是定義一個重載運算子的函數,在需要執行被重載的運算子時,系統就自動調用該函數,以實現相應的運算。也就是說,運算子多載是通過定義函數實現的。運算子多載實質上是函數的重載。重載運算子的函數一般格式如下:
函數類型 operator 運算子名稱 (形參表列)
{
對運算子的重載處理
}
重載為類成員函數時參數個數=原運算元個數-1
(後置++、--除外)
重載為友元函數時 參數個數=原運算元個數,且至少應該有一個自訂類型的形參。
將“+”、“-”運算重載為複數類的成員函數。
規則:
實部和虛部分別相加減。
運算元:
兩個運算元都是複數類的對象。
#include<iostream>
using namespace std;
class complex //複數類聲明
{
public: //外部介面
complex(double r=0.0,double i=0.0)
{
real=r;
imag=i;
} //建構函式
complex operator + (complex c2); //+重載為成員函數
complex operator - (complex c2); //-重載為成員函數
void display(); //輸出顯示複數
private: //私人資料成員
double real; //複數實部
double imag; //複數虛部
};
complex complex::operator +(complex c2) //重載函數實現
{
complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
return complex(c.real,c.imag);
}
complex complex::operator -(complex c2) //重載函數實現
{
complex c;
c.real=real-c2.real;
c.imag=imag-c2.imag;
return complex(c.real,c.imag);
}
void complex::display()
{ cout<<"("<<real<<","<<imag<<“i”<<")"<<endl; }
void main() //主函數
{ complex c1(5,4),c2(2,10),c3; //聲明複數類的對象
cout<<"c1="; c1.display();
cout<<"c2="; c2.display();
c3=c1-c2; //使用重載運算子完成複數減法
cout<<"c3=c1-c2=";
c3.display();
c3=c1+c2; //使用重載運算子完成複數加法
cout<<"c3=c1+c2=";
c3.display();
}
程式輸出的結果為:
c1=(5,4i)
c2=(2,10i)
c3=c1-c2=(3,-6i)
c3=c1+c2=(7,14i)
在本程式中對運算子“+”,”-”進行了重載,使之能用於兩個複數的相加減。在該例中運算子多載函數operator+ ,operator-作為Complex類中的成員函數。
“+” ,”-”是雙目運算子,為什麼在程式中的重載函數中只有一個參數呢?實際上,運算子多載函數有兩個參數,由於重載函數是Complex類中的成員函數,有一個參數是隱含的,運算子函數是用this指標隱式地訪問類對象的成員。
可以看到,重載函數operator+訪問了兩個對象中的成員,一個是this指標指向的對象中的成員,一個是形參對象中的成員。如this->real+c2.real,this->real就是c1.real。
在將運算子函數重載為成員函數後,如果出現含該運算子的運算式,如c1+c2,編譯系統把它解釋為c1.operator+(c2)
即通過對象c1調用運算子多載函數,並以運算式中第二個參數(運算子右側的類對象c2)作為函數實參。運算子多載函數的傳回值是Complex類型,傳回值是複數c1和c2之和(Complex(c1.real + c2.real,c1.imag+c2.imag))。