重載(Overloading):所謂重載是指不同的函數實體共用一個函數名稱。例如以下代碼所提到的CPoint之中,有兩個member functions的名稱同為x(): 1 class CPoint{ 2 3 public: 4 float x(); 5 void x(float xval); 6 ...
重載(Overloading):所謂重載是指不同的函數實體共用一個函數名稱。例如以下代碼所提到的CPoint之中,有兩個member functions的名稱同為x():
1 class CPoint{ 2 3 public: 4 float x(); 5 void x(float xval); 6 7 };
其兩個member functions實現代碼如下:
1 float CPoint::x(){return x;} 2 void CPoint::x(float xval){_x=xval;}
函數名稱相同,但參數不同(個數不同,型別也不同),實現代碼也不相同。C++之所以有function overloading的機制,是為瞭解決因為數據類型不同而需要設計多個演算法相同,但函數名不同的函數代碼的問題。舉個例子,加法就是加法,如果為了int、float、double、long....各設計出對應的AddInt()、AddFloat()、AddDouble()、AddLong()...等加法函數,我們會覺得很煩鎖,不漂亮。如果能夠把它們全部都叫做Add(),而我們不管對哪種數據類型做加法運算,都呼叫Add()就好,那麼就運算層面來看就清爽多了。至於底層機制,則由編譯器根據Add()所獲得的參數型別,決定真正該喚起哪一個Add()函數實體。於是,以加法為例,我們可以設計以下四個同名函數:
1 int Add(int a,int,b); 2 long Add(long a,long b); 3 double Add(double a, double b); 4 float Add(float a,float b);
並這樣使用之:
1 int i=Add(3,5); 2 long l=Add(3L,5L); 3 double d=Add(3.1415926,5.1615926); 4 float f=Add(3.14,5.14);
Function overloading 適用於class member functions (如先前的CPoint::x()),也適用於一般的global functions(如上術的Add()).
Function overloading 無法適用於函數名稱相同,參數也完全相同,只有返回值不同的情況。這種情況將無法通過編譯,會出現報錯提示:
error C2556: 'Add' : overloaded functions only differ by return type
我們已經看到了,所謂的function overloading 只不過是讓諸多的函數實體可以採用相同的函數名稱,事實上你還是要編寫好幾份不同(但邏輯十分類式)的函數實現代碼。為了能夠解決因為數據類型不同而需要設計多個演算法相同,但函數名不同的函數代碼的問題,比較好的做法是把參數看作只有一種類型。C++ Template 可以辦到這一點,我們將在往後的文章來談這個非常棒的主題。