亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++深入學習之徹底理清重載函數匹配

2020-05-23 13:21:38
字體:
來源:轉載
供稿:網友

前言

前面我們講到了《函數重載》,有了函數重載之后,就需要確定某次調用需要選用哪個函數。這個過程可以稱之為函數匹配或者重載確定。大多數情況下,我們都很容易能夠確定某次調用需要選用哪個函數,但事實上不盡然。但通過本文將徹底理清重載函數匹配

匹配過程

為便于說明,將函數匹配分為三個階段,確定候選函數,確定可行函數,確定最佳匹配函數。

確定候選函數

候選函數也就是和被調用的函數同名,并且其聲明在調用點可見。舉個簡單的例子。

假設有兩個文件,1.cpp和2.cpp,內容分別如下:

1.cpp:

//函數1 void f(int a,short b) { cout<<"func0"<<endl; }

2.cpp:

#include<iostream> using namespace std; //函數2 void f(int a,double b) { cout<<"func1"<<endl; } //函數3void f(int a, int b) { cout<< "func2"<<endl; } //函數4 void f1() { cout<<"func3"<<endl; } int main() { f(3,4.5); return 0; }

在這里,候選函數其實只有兩個,其中第一個函數在其調用點不可見,而第四個函數和被調用的函數不同名,因此這兩個都不是候選函數。

確定可行函數

可行函數指的是本次調用傳入的實參能夠被候選函數使用。它要滿足兩個條件, 一是形參數量和實參數量相同,二是每個實參的類型和對應形參類型相同或者能夠轉換成形參的類型。

還是前面的例子,實參的個數和類型與第二個函數完全匹配,而在經過算術轉換之后,也能夠與第三個函數匹配。

確定最佳匹配函數

最佳匹配的函數是最終調用的。最佳匹配最基本的思想是認為,實參類型越接近,它們就越匹配。還是前面的例子,實參要與第三個函數匹配,需要進行算術轉換,而與第二個函數完全匹配,因此第二個函數是最佳匹配函數。最終的運行結果如下:

func1

最佳匹配原則

一般來說,精確匹配肯定比需要類型轉換的匹配要更好,但是當形參有多個,并且無法完全精確匹配的時候,要確定最佳匹配函數就有點困難了。

但是有下面的原則:

  • 函數的每個實參的匹配都不能比其他可行函數更差
  • 函數至少有一個實參的匹配要比其他可行函數更好

那么問題又來了,什么是更好,什么又是更差呢?編譯器將實參類型到形參類型的轉換劃分了等級:

1.精確匹配,包括實參類型和形參類型相同,實參從數組或函數轉換成對應的指針類型,向實參添加頂層const或從實參刪除頂層const

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

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

4.通過算數類型轉換實現的匹配

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

等級越前,匹配也就越好。接下來對上面的內容做一些解釋。

精確匹配

精確匹配比較容易理解。關于頂層const問題,可以參考《函數重載

通過const轉換實現的匹配

所謂通過const轉換實現的匹配,指的是通過加const限定詞,能夠與可行函數精確匹配。例如:

#include <iostream>using namespace std;//函數1/*int f(string &a){ cout<<"call function 1"<<endl; return 0;}*///函數2int f(const string &a){ cout<<"call function 2"<<endl; return 0;}int main(){ string test = "test"; f(test); return 0;}

在這里,test可以通過const轉換,從而匹配函數2,將能夠找到最佳匹配函數2(當前情況它也只有一個可選了)。
運行結果如下:

call function 2

如果把函數1的注釋去掉再運行,就會發現,雖然第一個調用既能匹配函數1,也能匹配函數2,但是由于匹配函數2的時候,需要const轉換,因此比精確匹配要差,最終,它會調用函數1。
去掉函數1的注釋后,運行結果如下:

call function 1

通過類型提升實現的匹配

關于類型提升,這里不多做介紹。簡單說明類型提升規則:

  • float將提升到double
  • char、short和相應的signed、unsigned類型將提升到int

我們來看一個示例:

#include <iostream>using namespace std;//函數1/*int f(short a){ cout<<"call function 1"<<endl; return 0;}*///函數2int f(int a){ cout<<"call function 2"<<endl; return 0;}int main(){ short a = 2; f(a); return 0;}

同樣地,我們暫時把函數1注釋掉。由于a是short類型,但是通過類型提升,可以轉換為int,因為它也能調用函數2。運行結果如下:

call function 2

但去掉函數1注釋后,由于精確匹配優于通過類型提升的匹配,因此將會調用函數1,運行結果如下:

call function 1

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

short int和float,double等之間的轉換,都是算術類型之間的轉換。我們仍然來看一個例子:

#include <iostream>using namespace std;//函數1int f(int a){ cout<<"call function 1"<<endl; return 0;}//函數2int f(double a){ cout<<"call function 2"<<endl; return 0;}int main(){ short a = 2; f(a); return 0;}

在這里,short類型的a既可以通過類型提升轉換為int,也可以通過算術類型轉換成為double。這個時候,哪個才是最佳匹配呢?我們看運行結果:

call function 1

對于這個結果,并不意外,因為前面我們已經說到,通過類型提升的轉換是優于算術轉換的,因而函數1是它的最佳匹配函數。

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

這里不多做介紹。我們也很容易理解。諸如父類和子類之間的轉換都是如此。

二義性示例

前面基本能夠找到最佳匹配,我們來看一個有多個可行函數,最后卻沒有最佳匹配的情況。

#include<iostream>using namespace std;//函數1void f(double a,int b){ cout<<"function 1"<<endl;}//函數2void f(int a,double b){ cout<<"function 2"<<endl;}int main(){ f(1,1); return 0;}

函數1和函數2都是可行函數,但它們都沒有在任意一個參數上比對方更好,因此將會產生二義性,編譯時將會報錯:

error: call of overloaded ‘f(int, int)' is ambiguous

總結

  • 調用重載函數時,應當避免強制類型轉換。
  • 設計重載函數時應避免可能產生的二義性。
  • 如果無法找到可行函數,編譯器將報錯。
  • 設計重載函數的時候,希望避免需要用到上面的知識,而在定位問題時能夠利用上面的知識很快定位問題。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久一区探花| 精品动漫一区二区三区| 国产成人自拍视频在线观看| 日韩国产精品亚洲а∨天堂免| 久久久久久久久久久免费| 国产精品成人品| 日本一区二三区好的精华液| 97视频在线观看视频免费视频| 欧日韩不卡在线视频| 色妞在线综合亚洲欧美| 久久久久久久久久国产精品| 日韩av电影在线免费播放| 日韩在线一区二区三区免费视频| 欧美大胆在线视频| 日韩电影中文字幕| 国产日韩欧美日韩大片| 上原亚衣av一区二区三区| 国产精品第三页| 777精品视频| 成人观看高清在线观看免费| 欧美巨猛xxxx猛交黑人97人| 亚洲欧美在线免费| 亚洲欧美一区二区三区久久| 日韩精品免费在线| 国产精品 欧美在线| 国产99久久精品一区二区永久免费| 亚洲综合中文字幕在线观看| 91色精品视频在线| 国产日韩欧美影视| 欧美精品videosex性欧美| 久久久av一区| 国产精品一区专区欧美日韩| 欧美一性一乱一交一视频| 17婷婷久久www| 欧美日韩国产黄| 欧美在线视频网站| 精品成人av一区| 国产精品海角社区在线观看| 国产一区二区三区视频在线观看| 亚洲成成品网站| 在线视频欧美性高潮| 国产精品久久久久久久久粉嫩av| 欧美理论电影在线播放| 国产精品日日摸夜夜添夜夜av| 久久精品99久久久香蕉| 国产精彩精品视频| 欧美性猛交xxxx乱大交| 美女福利视频一区| 日韩免费视频在线观看| 91国产美女在线观看| 久久国产精品久久久久久久久久| 日韩精品在线视频美女| 欧美日韩在线看| 亚洲加勒比久久88色综合| 日韩资源在线观看| 欧美视频在线免费看| 伊人久久五月天| 久久久久国产精品免费网站| 欧美激情第三页| 亚洲综合社区网| 国产在线高清精品| 亚洲一区美女视频在线观看免费| 成人黄色av网| 亚洲精品美女免费| 日本在线观看天堂男亚洲| 久久久噜噜噜久久| 国产精品入口免费视频一| 亚洲码在线观看| 黑人狂躁日本妞一区二区三区| 欧美日韩免费在线观看| 国产精品精品久久久久久| 亚洲国产精品va在看黑人| 欧美大人香蕉在线| 国产精品欧美在线| 亚洲欧美日韩精品久久奇米色影视| 欧美精品18videosex性欧美| 最新国产成人av网站网址麻豆| 欧美激情第99页| 久久99国产精品久久久久久久久| 国产精品亚发布| 国产精品自拍偷拍| 成人av.网址在线网站| 成人午夜两性视频| 欧美激情亚洲自拍| 96精品视频在线| 这里只有视频精品| 久热99视频在线观看| 2023亚洲男人天堂| 国产精品美女主播在线观看纯欲| 欧美猛交免费看| 久久久欧美精品| 成人性生交大片免费看小说| 在线精品视频视频中文字幕| 久久精品国亚洲| 亚洲激情在线视频| 亚洲第一色在线| 亚洲精品久久久一区二区三区| 亚洲欧洲一区二区三区久久| 日本精品视频在线观看| 久久精品亚洲一区| 91性高湖久久久久久久久_久久99| 另类图片亚洲另类| 7777精品视频| 亚洲欧美中文字幕在线一区| 日韩欧美一区二区在线| 91日本在线视频| 成人黄色在线观看| 国产亚洲精品久久久久久牛牛| 热re91久久精品国99热蜜臀| 精品福利视频导航| 伊人av综合网| 最近2019中文免费高清视频观看www99| 成人妇女免费播放久久久| 国产日韩精品一区二区| 久色乳综合思思在线视频| 欧美老女人性生活| 色综合影院在线| 久久精品夜夜夜夜夜久久| 91免费精品国偷自产在线| 久久国产精品影视| 国产视频在线一区二区| 蜜臀久久99精品久久久久久宅男| 北条麻妃一区二区在线观看| 欧美日韩一区二区在线播放| 国产亚洲精品久久久久久777| 亚洲成人激情小说| 国产一区二区三区18| 亚洲精品www久久久久久广东| 深夜福利亚洲导航| 中文字幕亚洲无线码a| 欧美成人久久久| 91亚洲国产成人久久精品网站| 欧美日韩国产一区中文午夜| 欧美日韩高清在线观看| 欧美最顶级的aⅴ艳星| 日韩精品黄色网| 91伊人影院在线播放| 国产美女主播一区| 久久69精品久久久久久久电影好| 国产日产久久高清欧美一区| 午夜精品一区二区三区视频免费看| 亚洲欧美变态国产另类| 国产精品九九久久久久久久| 中文字幕无线精品亚洲乱码一区| 国产精品成人v| 色妞欧美日韩在线| 国产精品高清免费在线观看| 亚洲精品国产成人| 亚洲视频日韩精品| 亚洲视频一区二区| 欧美性猛交xxxx富婆| 国产精选久久久久久| 亚洲最大福利视频网站| 亚洲欧美国内爽妇网| 亚洲国产精品免费| 91在线播放国产| 日韩av在线免费播放| 久久精品国产成人精品| 欧美专区福利在线| 色妞色视频一区二区三区四区| 精品美女久久久久久免费| 国自在线精品视频| 国产香蕉97碰碰久久人人| 亚洲第一偷拍网|