C++函數(shù)重載介紹與原理詳解
函數(shù)重載
函數(shù)重載的概念
函數(shù)重載是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類(lèi)似的同名函數(shù),這些同名函數(shù)的形參列表必須不同。函數(shù)重載常用來(lái)處理實(shí)現(xiàn)功能類(lèi)似,而數(shù)據(jù)類(lèi)型不同的問(wèn)題。
#include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, double y) { return x + y; } int main() { cout << Add(1, 2) << endl;//打印1+2的結(jié)果 cout << Add(1.1, 2.2) << endl;//打印1.1+2.2的結(jié)果 return 0; }
注意:形參列表不同是指參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型或者參數(shù)順序不同,若僅僅是返回類(lèi)型不同,則不能構(gòu)成重載。
函數(shù)重載的原理(名字修飾)
為什么C++支持函數(shù)重載,而C語(yǔ)言不支持函數(shù)重載呢?
我們知道,一個(gè)C/C++程序要運(yùn)行起來(lái)都需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接。
在編譯階段會(huì)將程序中的每個(gè)源文件的全局范圍的變量符號(hào)分別進(jìn)行匯總。在匯編階段會(huì)給每個(gè)源文件匯總出來(lái)的符號(hào)分配一個(gè)地址(若符號(hào)只是一個(gè)聲明,則給其分配一個(gè)無(wú)意義的地址),然后分別生成一個(gè)符號(hào)表。最后在鏈接期間會(huì)將每個(gè)源文件的符號(hào)表進(jìn)行合并,若不同源文件的符號(hào)表中出現(xiàn)了相同的符號(hào),則取合法的地址為合并后的地址(重定位)。
在C語(yǔ)言中,匯編階段進(jìn)行符號(hào)匯總時(shí),一個(gè)函數(shù)匯總后的符號(hào)就是其函數(shù)名,所以當(dāng)匯總時(shí)發(fā)現(xiàn)多個(gè)相同的函數(shù)符號(hào)時(shí),編譯器便會(huì)報(bào)錯(cuò)。而C++中進(jìn)行符號(hào)匯總時(shí),對(duì)函數(shù)的名字修飾做了改動(dòng),函數(shù)匯總出的符號(hào)不再單單是函數(shù)的函數(shù)名,而是通過(guò)其參數(shù)的類(lèi)型和個(gè)數(shù)以及順序等信息匯總出 一個(gè)符號(hào),這樣一來(lái),就算是函數(shù)名相同的函數(shù),只要其參數(shù)的類(lèi)型或參數(shù)的個(gè)數(shù)或參數(shù)的順序不同,那么匯總出來(lái)的符號(hào)也就不同了。
注:不同編譯器下,對(duì)函數(shù)名的修飾不同,但都是一樣的。
總結(jié):
- C語(yǔ)言不能支持重載,是因?yàn)橥瘮?shù)沒(méi)辦法區(qū)分。而C++是通過(guò)函數(shù)修飾規(guī)則來(lái)區(qū)分的,只要函數(shù)的形參列表不同,修飾出來(lái)的名字就不一樣,也就支持了重載。
- 另外我們也理解了,為什么函數(shù)重載要求參數(shù)不同,和返回值沒(méi)關(guān)系。
extern “C”
有時(shí)候在C++工程中可能需要將某些函數(shù)按照C的風(fēng)格來(lái)編譯,在函數(shù)前加“extern C”,意思是告訴編譯器,將該函數(shù)按照C語(yǔ)言規(guī)則來(lái)編譯。
注意:在函數(shù)前加“extern C”后,該函數(shù)便不能支持重載了。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言之循環(huán)語(yǔ)句詳細(xì)介紹
大家好,本篇文章主要講的是C語(yǔ)言之循環(huán)語(yǔ)句詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄(2)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單電子通訊錄的第二部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06C語(yǔ)言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析
用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車(chē)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析的相關(guān)資料,需要的朋友可以參考下2022-03-03C++使用智能指針實(shí)現(xiàn)模板形式的單例類(lèi)
這篇文章主要為大家詳細(xì)介紹了C++使用了智能指針實(shí)現(xiàn)模板形式的單例類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06C++臨時(shí)性對(duì)象的生命周期詳細(xì)解析
臨時(shí)性對(duì)象的被摧毀,應(yīng)該是對(duì)完整表達(dá)式(full-expression)求值過(guò)程中的最后一個(gè)步驟。該完整表達(dá)式造成臨時(shí)對(duì)象的產(chǎn)生2013-09-09基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解
本篇文章是對(duì)Sizeof與Strlen的區(qū)別以及聯(lián)系的使用進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05C++實(shí)現(xiàn)對(duì)象化的矩陣相乘小程序
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)對(duì)象化的矩陣相乘小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09