函數重載指的是同一範圍下的函數名相同,參數列表不同的函數之間的關係(與傳回值無關)。
考慮以下面的這組函數和函數調用:
void f();
void f(int);
void f(int,int);
void f(double,double=3.14);
f(5.6); //call void f(double,double)
根據以下三個步驟確定函數:
1.確定候選函數
候選函數是與被調用函數同名的函數,並且在調用點上,它的聲明可見。在例子中,有四個名為f的候選函數。
2.選擇可行函數
可行函數必須滿足兩個條件:第一,函數的形參個數與該調用的實參個數相同;第二,每一個實參的類型必須與對應的形參的類型匹配,或者可被隱式轉換為對應的形參類型。如果沒有找到可行函數,則該調用錯誤。在例子中,f(int)和f(double,double)都是可行的。
3.尋找首選(如果有的話)
為了確定首選,編譯器將實參類型到相應形參類型的轉換劃分等級,降序排列如下:
(1)精確匹配。實參與形參的類型完全一致。
(2)通過型別提升實現的匹配。
(3)通過標準轉換實現的匹配。
(4)通過類類型轉換實現的匹配。
例如:
void ff(int);
void ff(short);
ff('a');
字條字面值是char 類型,可提升為int型,也可轉換為short型,但是類型轉換的匹配劣於型別提升的匹配,結果應該該調用解釋為對ff(int)的調用。
而對如下:
void manip(long);
void manip(float);
maip(3.14);
由於兩者都是可行的標準轉換,因此調用具有二義性。
4.含有多個形參的重載確定
如果函數調用使用了兩個或者兩個以上的顯示實參,則函數匹配會更加複雜。如果有且僅有一個函數滿足下列條件,則匹配成功:
(1)其每個實參的匹配都不劣於其他可行函數需要的匹配。
(2)至少有一個實參的匹配優於其他可行函數提供的匹配。
如:f(42,2.56);該調用上面例子中的哪個函數呢?
根據上面的規則可知會發生調用二義性,即編譯器也無法決斷了。