C++多態(tài)與虛擬:函數(shù)重載(Function Overloading)
重載(Overloading):所謂重載是指不同的函數(shù)實(shí)體共用一個(gè)函數(shù)名稱。例如以下代碼所提到的CPoint之中,有兩個(gè)member functions的名稱同為x():
1 class CPoint{ 2 3 public: 4 float x(); 5 void x(float xval); 6 7 };
其兩個(gè)member functions實(shí)現(xiàn)代碼如下:
1 float CPoint::x(){return x;} 2 void CPoint::x(float xval){_x=xval;}
函數(shù)名稱相同,但參數(shù)不同(個(gè)數(shù)不同,型別也不同),實(shí)現(xiàn)代碼也不相同。C++之所以有function overloading的機(jī)制,是為了解決因?yàn)閿?shù)據(jù)類型不同而需要設(shè)計(jì)多個(gè)算法相同,但函數(shù)名不同的函數(shù)代碼的問題。舉個(gè)例子,加法就是加法,如果為了int、float、double、long....各設(shè)計(jì)出對應(yīng)的AddInt()、AddFloat()、AddDouble()、AddLong()...等加法函數(shù),我們會(huì)覺得很煩鎖,不漂亮。如果能夠把它們?nèi)慷冀凶鯝dd(),而我們不管對哪種數(shù)據(jù)類型做加法運(yùn)算,都呼叫Add()就好,那么就運(yùn)算層面來看就清爽多了。至于底層機(jī)制,則由編譯器根據(jù)Add()所獲得的參數(shù)型別,決定真正該喚起哪一個(gè)Add()函數(shù)實(shí)體。于是,以加法為例,我們可以設(shè)計(jì)以下四個(gè)同名函數(shù):
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(如上術(shù)的Add()).
Function overloading 無法適用于函數(shù)名稱相同,參數(shù)也完全相同,只有返回值不同的情況。這種情況將無法通過編譯,會(huì)出現(xiàn)報(bào)錯(cuò)提示:
error C2556: 'Add' : overloaded functions only differ by return type
我們已經(jīng)看到了,所謂的function overloading 只不過是讓諸多的函數(shù)實(shí)體可以采用相同的函數(shù)名稱,事實(shí)上你還是要編寫好幾份不同(但邏輯十分類式)的函數(shù)實(shí)現(xiàn)代碼。為了能夠解決因?yàn)閿?shù)據(jù)類型不同而需要設(shè)計(jì)多個(gè)算法相同,但函數(shù)名不同的函數(shù)代碼的問題,比較好的做法是把參數(shù)看作只有一種類型。C++ Template 可以辦到這一點(diǎn),我們將在往后的文章來談這個(gè)非常棒的主題。
浙公網(wǎng)安備 33010602011771號