日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

初识C++之函数重载

發(fā)布時(shí)間:2024/9/27 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识C++之函数重载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近開(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ò)誤的:

int Add(int a, int b) {return a + b; }double Add(double a, double b) {return a + b; }

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。