回首譚浩強《C++程式設計》,開篇就來講講重載。
首先,函數重載。
特點如下:
①重載函數的函數名相同。如求最大值的函數,int max(int a,int b)和double max(double a,double b)。
②聲明時形參的個數或類型或順序必須至少有一項不同。
③特別需要注意的是函數類型不能作為函數重載的一種標誌。也即是,如果函數名相同、形參個數以及類型都對應相同,只有函數類型不同,
這樣的函數重載是錯誤的。因為編譯系統無法知道調用哪個。
看到這,你是否有這樣的疑問:僅僅函數名不同,函數重載有何意義?應該說對於小型程式而言,重載和不重載區別並不是很大。但是,我們
試想下:如果程式規模很大,這是又會如何呢?就拿前面的求最大值的函數來說,具體程式中可能要是要整數求最大值,單精確度數求最大值,
雙精確度數求最大值等等,如果都是不同的名字,那麼我們就得時刻注意我們要調用哪個函數,容易出錯。同名之後,這一問題就解決了。
其次,運算子多載。
⑴為什麼要有運算子多載?
C++提供的運算子只是完成了標準資料類型的種種運算,比如加減乘除。但C++是物件導向,實際編程過程中必然會涉及到建立新類型。
而這些新類型是無法直接運用C++提供的運算子的。需要重載。
⑵重載的方法?
運算子多載的方法是定義一個重載運算子的函數,在需要執行被重載的運算子時,系統就自動調用該函數,以實現相應的運算。所以,可以
說:運算子多載的實質還是函數重載。
⑶運算子多載要注意哪些方面?
①只允許重載已存在的運算子。使用者不能自己創造運算子。
②重載不能改變運算子運算對象的個數。
③重載不能改變運算子的優先順序。
④重載不能改變運算子的結合性。
⑤重載運算子的函數不能有預設的參數。
⑥重載的運算子必須和由使用者定義的自訂類型的對象一起使用,其參數至少有一個是類對象或類對象的引用。
⑦用於類對象的運算子一般必須重載,但也有例外,運算子“=”和“&”不必使用者定義。
⑧應該使重載運算子的功能類似於該運算子作用於標準資料類型時所體現的功能。
⑨運算子多載函數可以是類的成員函數,也可以是類的友元函數,也可以僅僅只是普通函數。
最後,介紹了前面的一些基礎理論後,我用一個小程式來實現相應的功能。
該程式是用來是實現複數與複數相加以及複數與雙精確度數相加的。其中有對“+”的重載函數,同時也體現了函數的重載。
具體見程式注釋部分。
代碼如下:(VC6.0下調試正確)
#include<iostream.h>class Complex //複數類{public:Complex();Complex(double a,double b);/*對“+”的重載*/Complex operator+(Complex &a); /*對“+”的重載,以及函數重載*/friend Complex operator+(double &a,Complex &b); friend Complex operator+(Complex &a,double &b);void display();private:double real;double image;};Complex::Complex(){real=0;image=0;}Complex::Complex(double a,double b){real=a;image=b;}Complex Complex::operator+(Complex &a){Complex c;c.real=real+a.real;c.image=image+a.image;return c;}Complex operator+(double &a,Complex &b){return Complex(a+b.real,b.image);}Complex operator+(Complex &a,double &b){return Complex(a.real+b,a.image);}void Complex::display(){cout<<"("<<real<<","<<image<<"i)"<<endl;}int main(){Complex c1(2,-1),c2(5,9),c3,c4,c5;cout<<"c1=";c1.display();cout<<"c2=";c2.display();c3=c1+c2; //複數相加cout<<"c3=";c3.display();double a;cin>>a;c4=a+c1; //雙精確度數加複數cout<<"c4=";c4.display();c5=c2+a; //複數加雙精確度數cout<<"c5=";c5.display();return 0;}
測試結果:
寫在最後:筆者能力有限,如有錯漏之處,還請不吝賜教!