重載函數確定的三個步驟

來源:互聯網
上載者:User

函數重載指的是同一範圍下的函數名相同,參數列表不同的函數之間的關係(與傳回值無關)。
考慮以下面的這組函數和函數調用:
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);該調用上面例子中的哪個函數呢?
根據上面的規則可知會發生調用二義性,即編譯器也無法決斷了。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.