C++函數匹配

候選--->可行--->最佳

候選:

1、與被調用的函數同名。

2、其聲明在調用點可見。

 

可行:

1、其形參數量與本次調用提供的實參數量相等。

2、每個實參的類型與對應的形參類型相同,或者能轉換成形參的類型。

 

最佳:

1、        精確匹配:

l  實參類型和形參類型相同

l  實參從數組類型或函數類型轉換成對應的指針類型

l  向實參添加頂層const或者從實參中刪除頂層const(也就是說頂層const對匹配無影響)

2、        通過const轉換實現的匹配

3、        通過類型提升實現的匹配

4、        通過算術類型轉換實現的匹配

5、        通過類類型轉換實現的匹配

Record lookup(Account&);

Record lookup(const  Account&);

const Account  a;

Account b;

 

lookup(a);    //調用Record  lookup(const Account&)

lookup(b);    //調用Record  lookup(Account&)

底層const是能區分最佳與否的,首先不能將普通引用綁定到const對象上。要不然常量將會被普通引用修改。所以lookup(a)只能調用Record lookup(const  Account&)。

      而lookup(b),兩種函數都可調用,然而Record  lookup(Account&)精確匹配,

      而Record  lookup(const  Account&)需要將Account轉換成const  Account,

      所以Record  lookup(const  Account&)更佳。

 

在以前還沒有函數原型的概念的時候,函數調用,實參只做類型提升,小整形一般都會提升到int類型或更大的整數類型。而浮點類型一般提升到double。有了函數原型後,需要進行進一步的處理,提供可能需要的類型轉換。

void   ff(short);

ff(‘a’);          //char被提升到int,再由int隱式類型轉換成short。

如果本作用域下還有個void ff(int)函數,那麼通過最佳匹配的原則3和原則4,優先調用通過類型提升的匹配,char先會類型提升到int,所以將調用形參爲int的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章