最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ù)匹配的評論 (共 條)

分享到微博請遵守國家法律
历史| 张家口市| 临沂市| 苏州市| 衡南县| 福贡县| 淮滨县| 思茅市| 朝阳市| 平利县| 日照市| 鄂托克旗| 靖安县| 甘洛县| 长岛县| 重庆市| 渑池县| 浑源县| 毕节市| 英德市| 遂平县| 奉新县| 永清县| 双柏县| 团风县| 平陆县| 临武县| 永川市| 新平| 长海县| 武平县| 含山县| 岑巩县| 台东县| 岳普湖县| 海兴县| 九龙坡区| 武平县| 海原县| 佛学| 龙门县|