初识C++之函数重载
最近開(kāi)始學(xué)習(xí)C++,了解到它在C語(yǔ)言沒(méi)有的一個(gè)特性 – 函數(shù)重載,這一特性使得c++的函數(shù)數(shù)量得以減少,減小了對(duì)名字空間的污染,另外對(duì)程序的可讀性也有很大幫助。
那么c++的函數(shù)重載這一特性是怎么實(shí)現(xiàn)的,為什么不會(huì)發(fā)生命名沖突呢?別的函數(shù)在調(diào)用這些函數(shù)時(shí)編譯器是怎么解析的呢?怎么知道它該調(diào)用哪一個(gè)函數(shù)呢?下面就這些問(wèn)題來(lái)做一些簡(jiǎn)單解析。
1、什么是函數(shù)重載
C++允許在同一作用域內(nèi)聲明并實(shí)現(xiàn)幾個(gè)名稱(chēng)相同,功能相似的函數(shù),但必須保證這些函數(shù)的參數(shù)列表不同(參數(shù)個(gè)數(shù)不同、參數(shù)類(lèi)型不同或者參數(shù)順序不同)
根據(jù)上面的定義,判斷哪些是正確的函數(shù)重載,哪些是錯(cuò)誤的:
①
②
double Add(double a, int b) {return a + b; }double Add(int a, double b) {return a + b; }③
int Add(int a, int b) {return a + b; }int Add(int a, int b, int c) {return a + b + c; }④
double Add(int a, double b) {return a + b; }double Add(int b, double a) {return a + b; }⑤
int Add(int a, int b) {return a + b; }double Add(int a, int b) {return a + b; }①②③很容易得出都是正確的函數(shù)重載;
④乍一看,很像是滿足了參數(shù)順序不同這一條件,但仔細(xì)分析一下,函數(shù)在定義或聲明是是可以省略參數(shù)名的,因?yàn)榫幾g器只檢查函數(shù)參數(shù)的類(lèi)型與個(gè)數(shù),并不會(huì)檢查函數(shù)名。那么,④的兩個(gè)函數(shù)就可以看做是一個(gè),因?yàn)樗鼈儫o(wú)法構(gòu)成函數(shù)重載;
⑤看起來(lái)也很像啊,但它滿足函數(shù)重載的任何要求了嗎,另個(gè)函數(shù)參數(shù)列表完全是一樣的,唯一不一樣的就是函數(shù)的返回值不同,但僅僅返回不同是無(wú)法構(gòu)成函數(shù)重載的的,因此,它們也無(wú)法構(gòu)函數(shù)重載。
2、為什么需要函數(shù)重載
想一想我們的C語(yǔ)言里是怎么定義不同類(lèi)型的數(shù)據(jù)的加法函數(shù)的:
int Add(int a, int b); –> int 型數(shù)據(jù)的加法函數(shù)
short Add(short a, short b); –> short 型數(shù)據(jù)的加法函數(shù)
double Add(double a, double b); –> double 型數(shù)據(jù)的加法函數(shù)
是不是感覺(jué)很麻煩,都是同一功能的函數(shù),卻要起不同的名字,正式基于這一點(diǎn),c++允許實(shí)現(xiàn)函數(shù)重載,這樣不僅同一功能的函數(shù)都能叫同一名字,而且節(jié)省了名字空間。
3、編譯器如何解決函數(shù)重載的命名沖突
c++確實(shí)能支持函數(shù)重載,但編譯器是怎么處理這種特性,使它們?cè)诰幾g后不會(huì)出現(xiàn)名字沖突的呢?
這里可以參考我的另一篇博客:
重載函數(shù)編譯后的新名字
http://blog.csdn.net/ljx_5489464/article/details/50981773
4、編譯器如何解析重載函數(shù)的調(diào)用呢?
上面我們知道了,編譯器通過(guò)一定的機(jī)制使重載函數(shù)在編譯后不會(huì)發(fā)生名字沖突,那么在調(diào)用這些重載的函數(shù)時(shí),編譯器是如何知道該調(diào)用哪一個(gè)的呢?
編譯器一般需要依次按照下列規(guī)則來(lái)判斷:
a. 精確匹配:參數(shù)列表完全匹配,或者只是做微不足道的轉(zhuǎn)換,如數(shù)組名到指針、函數(shù)名到指向函數(shù)的指針、T到const T;
b. 提升匹配:即整數(shù)提升(如bool 到 int、char到int、short 到int),float到double
c. 使用標(biāo)準(zhǔn)轉(zhuǎn)換匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;
d. 使用用戶自定義匹配;
e. 使用省略號(hào)匹配:類(lèi)似printf中省略號(hào)參數(shù)
通過(guò)以上規(guī)則來(lái)進(jìn)行選擇:
①根據(jù)函數(shù)名確定候選函數(shù)集
②確定可用函數(shù)
③確定最佳匹配函數(shù)
如果在最有多個(gè)最佳匹配函數(shù)找到,調(diào)用將被拒絕(因?yàn)橛衅缌x、模凌兩可)。
本文參考:
http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html
總結(jié)
以上是生活随笔為你收集整理的初识C++之函数重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux云服务器状态上报解决方案:外发
- 下一篇: 初识C++之函数重载、重写、重定义的区别