五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C++ 函數(shù)匹配

2023-04-06 20:38 作者:S-a-i_  | 我要投稿

確定候選函數(shù)和可行函數(shù)

函數(shù)匹配的第一步是選定本次調(diào)用函數(shù)的重載函數(shù)集,集合中的函數(shù)稱為候選函數(shù),候選函數(shù)具有兩個特征

1是與被調(diào)用函數(shù)同名

2是其聲明在調(diào)用點可見

第二步考察本次調(diào)用提供的實參,然后從候選函數(shù)中選出能被這組實參調(diào)用的函數(shù),這些新選出的函數(shù)稱為可行函數(shù),可行函數(shù)也有兩個特征

1是其形參數(shù)量與本次調(diào)用提供的實參數(shù)量相等

2是每個實參的類型與對應(yīng)的形參類型相同或者能夠轉(zhuǎn)換。

我們可以根據(jù)實參的數(shù)量從候選函數(shù)中排除兩個(第一個和第三個),其中第四個函數(shù)本應(yīng)該接受兩個double值,但是因為它含有一個默認實參,所以只用一個實參也能調(diào)用。上述調(diào)用中第二個函數(shù)也是可行的,因為5.6可以轉(zhuǎn)換為int型,但是第四個函數(shù)恰好匹配到了double型,與函數(shù)使用的完全一致。

注意:就像第四個函數(shù),我們輸入的實參可能少于我們實際調(diào)用函數(shù)的形參。一旦我們一個函數(shù)也無法匹配,那么編譯器就會報錯。


尋找最佳匹配(如果有的話)

函數(shù)匹配的第三步是從可行函數(shù)中選擇與本次調(diào)用最匹配的函數(shù),這一過程中,逐一檢查函數(shù)調(diào)用提供的實參,尋找形參類型和實參類型最匹配的可行函數(shù),他的基本思想就是實參類型和形參類型越接近匹配的越好。

在我們的例子中,調(diào)用只提供了一個顯式的實參,是double類型,如果調(diào)用f(int),實參將不得不從double轉(zhuǎn)換為int,另一個函數(shù)恰好是double,可以和實參精確匹配,因此調(diào)用第四個函數(shù),編譯器會為我們自動補上第二個實參。


含有多個形參的匹配函數(shù)

當實參的數(shù)量有兩個或者更多時,函數(shù)匹配就比較復(fù)雜了,試想如果我們調(diào)用

會發(fā)生什么

首先編譯器會選擇那些形參數(shù)量滿足要求且實參類型和形參類型能夠匹配的函數(shù)。同樣時第二個和第四個函數(shù),接下來編譯器依次檢查每個實參以確定那個函數(shù)時最佳匹配,如果有且只有一個函數(shù)滿足

1該函數(shù)每個實參的匹配都不劣于其他可行函數(shù)

2至少有一個實參的匹配優(yōu)于其他可行函數(shù)

如果在檢查了所有實參之后沒有任何一個函數(shù)脫穎而出,則函數(shù)調(diào)用是錯誤的,編譯器將報告二義性調(diào)用的信息。

那么對于上面的調(diào)用第一個實參用f(int,int)更好,但是第二個實參用f(double,double)更好,編譯器最終將因這個調(diào)用具有二義性而拒絕其請求。



實參類型轉(zhuǎn)換

為了確定最佳匹配,編譯器將實參類型到形參類型的轉(zhuǎn)換分成了幾個等級。

1精確匹配(包括實參類型和形參類型相同;實參從數(shù)組類型或函數(shù)類型轉(zhuǎn)換成對應(yīng)的指針類型;向?qū)崊⑻砑禹攲觕onst或者從實參中刪除頂層const)

2通過const轉(zhuǎn)換實現(xiàn)匹配

3通過類型提升實現(xiàn)的匹配

4通過算術(shù)類型轉(zhuǎn)換或指針轉(zhuǎn)換實現(xiàn)的匹配

5通過類類型轉(zhuǎn)換實現(xiàn)的匹配

上面有些我們以后會介紹


需要類型提升和算術(shù)類型轉(zhuǎn)換的匹配

注意:內(nèi)置類型的提升和轉(zhuǎn)換可能在函數(shù)匹配是產(chǎn)生意想不到的后果,但幸運的是,在設(shè)計良好的系統(tǒng)中函數(shù)很少會喊由于下面例子類似的形參

只有當調(diào)用提供的時short類型才會選擇short版本,有時候即使實參是一個很小的整數(shù),也會直接將他提升為int型,此時short版本反而會導(dǎo)致類型轉(zhuǎn)換。

所有算術(shù)類型轉(zhuǎn)換級別一樣高,例如int向unsigned int轉(zhuǎn)換并不從int向double轉(zhuǎn)換級別高

字面值3.14的類型時double,它既能轉(zhuǎn)換為long也能轉(zhuǎn)換為float,因為存在兩種可能的轉(zhuǎn)換所以該調(diào)用具有二義性。


函數(shù)匹配和const匹配

如果重載函數(shù)的區(qū)別在于他們的引用類型的參數(shù)是否引用了const或者指針類型的形參是否指向了const,則當調(diào)用發(fā)生時編譯器通過實參是否為常量來決定調(diào)用的函數(shù)

在第一個調(diào)用中,我們傳入的是const對象b,因為不能把普通引用綁定到const對象上,所以此例中為一個可行函數(shù)是以常量引用作為形參的那個函數(shù),并調(diào)用該函數(shù)與b精確匹配。

第二個調(diào)用中,我們傳入的是非常量對象c,這個調(diào)用兩個函數(shù)都可行,然而c的精確匹配是非常量引用,所以選擇非常量版本。

指針類型的形參也類似,如果兩個函數(shù)唯一的區(qū)別是他的指針形參指向常量或者非常量,則編譯器通過實參能否是常量決定使用哪個函數(shù)。

C++ 函數(shù)匹配的評論 (共 條)

分享到微博請遵守國家法律
遵化市| 永德县| 宜君县| 汶上县| 濉溪县| 丽水市| 绥棱县| 阿克苏市| 内江市| 寿阳县| 肇庆市| 新竹县| 宜兰县| 奎屯市| 怀柔区| 五寨县| 如东县| 阿荣旗| 兴仁县| 广东省| 静安区| 墨玉县| 凤城市| 江源县| 益阳市| 蕲春县| 尉氏县| 建阳市| 九龙坡区| 斗六市| 松原市| 花莲县| 临江市| 罗田县| 崇义县| 定陶县| 芒康县| 胶南市| 高陵县| 湘乡市| 来宾市|