淺析C++中的函數(shù)重載
一、什么是函數(shù)重載?
函數(shù)重載簡(jiǎn)介:在C++中,可以為兩個(gè)或兩個(gè)以上的函數(shù)提供相同的函數(shù)名稱(chēng),只要參數(shù)類(lèi)型不同,或者參數(shù)類(lèi)型相同而參數(shù)個(gè)數(shù)不同,又或者參數(shù)類(lèi)型參數(shù)個(gè)數(shù)相同,參數(shù)次序不同,稱(chēng)為函數(shù)重載。
舉例:
int my_max(int a,int b) { return a>b?a:b; } char my_max(char a, char b) { return a>b?a:b; } double my_max(double a,double b) { return a>b?a:b; } int main() { cout<<my_max(12,23)<<endl; cout<<my_max(12.23,23.34)<<endl; cout<<my_max('a','b')<<endl; return 0; }
二、函數(shù)重載的規(guī)則
1.編譯器的工作
當(dāng)一個(gè)函數(shù)名在同一個(gè)域中被聲明多次,兩個(gè)函數(shù)的參數(shù)表中參數(shù)個(gè)數(shù)或者類(lèi)型順序不同,則認(rèn)為是函數(shù)重載。
注意:調(diào)用者與函數(shù)之間的關(guān)系在編譯時(shí)就被綁定在一起,其地址關(guān)聯(lián)。
2.函數(shù)重載的原理
編譯器如何知道與哪個(gè)函數(shù)關(guān)聯(lián)?為什么C語(yǔ)言不能進(jìn)行函數(shù)重載,而C++可以?
編譯器是如何知道調(diào)用者與哪個(gè)函數(shù)關(guān)聯(lián)的呢?——通過(guò)名字粉碎(名字修飾)技術(shù) 。
“C”和“C++”函數(shù)是在編譯鏈接時(shí)通過(guò)修飾名來(lái)識(shí)別,而修飾名就是編譯器在編譯函數(shù)定義或聲明時(shí)生成的字符串,修飾名由函數(shù)名、類(lèi)名、調(diào)用約定、返回類(lèi)型、參數(shù)等共同決定的。
那調(diào)用約定有哪些呢?
_stdcall 回調(diào) :是Pascal缺省的調(diào)用方式,通常用于Win32 Api中,函數(shù)采用從右到左的壓棧方式,自己在退出時(shí)清空堆棧。
C調(diào)用約定(_cdecl):按從右到左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出,對(duì)于傳送參數(shù)的內(nèi)存棧是由調(diào)用者來(lái)維護(hù)的,因此實(shí)現(xiàn)可變參數(shù)的函數(shù)只能使用該調(diào)用約定。
_fastcall快速調(diào)用:通過(guò)寄存器傳遞參數(shù)(實(shí)際上,它是用ECX和EDX傳送前兩個(gè)雙字或更小的參數(shù),剩下參數(shù)仍然自右至左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的內(nèi)存棧),它的主要特點(diǎn)就是速度快
thiscall:僅僅應(yīng)用于C++類(lèi)中的成員函數(shù),this指針存放于ECX寄存器,參數(shù)自右向左壓
C語(yǔ)言為什么不能實(shí)現(xiàn)函數(shù)重載?
C語(yǔ)言編譯函數(shù)名修飾約定規(guī)則:C語(yǔ)言修飾函數(shù)名非常簡(jiǎn)單,_cdecl是C/C++的缺省調(diào)用方式,調(diào)用約定前面添加下劃線(xiàn)前綴即可,例:_functionname
例:
C語(yǔ)言編譯時(shí)無(wú)法通過(guò)修飾名區(qū)分調(diào)用者與函數(shù)之間的關(guān)系
而在C++中函數(shù)名修飾約定規(guī)則是:
(1)以“?”標(biāo)識(shí)函數(shù)名開(kāi)始,后跟函數(shù)名
(2)函數(shù)名后面以“@@YA”標(biāo)識(shí)參數(shù)表的開(kāi)始,后跟參數(shù)表
(3)參數(shù)表以代號(hào)表示
(4)參數(shù)表的第一項(xiàng)為該函數(shù)的返回值類(lèi)型,其后依次為參數(shù)的數(shù)據(jù)類(lèi)型,指針標(biāo)識(shí)在其所指數(shù)據(jù)類(lèi)型前
(5)參數(shù)表后以@Z標(biāo)識(shí)整個(gè)名字的結(jié)束,如果該函數(shù)無(wú)參數(shù),則以“Z”標(biāo)識(shí)結(jié)束。
常用代號(hào)如下:
X -- void
D -- char
E -- unsigned char
F -- short
H -- int
I -- unsigned int
J -- long
K -- unsigned long
M -- float
N -- double
_N -- bool
PA -- 表示指針,后面的代號(hào)表明指針類(lèi)型
例:
編譯鏈接時(shí),把參數(shù)類(lèi)型,函數(shù)返回類(lèi)型作為命名的一部分,編譯器編譯時(shí)可以區(qū)分調(diào)用哪個(gè)函數(shù)。
3.判斷函數(shù)重載的依據(jù)
可以確認(rèn)為函數(shù)重載:
(1)函數(shù)名相同,參數(shù)類(lèi)型不同
(2)參數(shù)類(lèi)型相同,參數(shù)個(gè)數(shù)不同
(3)參數(shù)類(lèi)型相同,參數(shù)個(gè)數(shù)相同,參數(shù)次序不同
不能作為判斷函數(shù)重載的依據(jù)的:
(1)參數(shù)表相同,返回類(lèi)型不同
例:
當(dāng)調(diào)用函數(shù)時(shí),有時(shí)候不需要返回值,編譯器不知道調(diào)去用哪個(gè)函數(shù),所以返回類(lèi)型不能作為判斷重載的依據(jù)。
到此這篇關(guān)于淺析C++中的函數(shù)重載的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中declspec(dllexport)和declspec(dllimport)?的用法介紹
這篇文章介紹了C++中declspec(dllexport)和declspec(dllimport)?的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04C語(yǔ)言簡(jiǎn)明講解隊(duì)列的實(shí)現(xiàn)方法
隊(duì)列(Queue)與棧一樣,是一種線(xiàn)性存儲(chǔ)結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡(jiǎn)稱(chēng)FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素2022-04-04C++中Digraphs、Trigraphs和Tokens的深入講解
這篇文章主要給大家介紹了關(guān)于C++中Digraphs、Trigraphs和Tokens的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09圖解AVL樹(shù)數(shù)據(jù)結(jié)構(gòu)輸入與輸出及實(shí)現(xiàn)示例
這篇文章主要為大家介紹了C++圖解AVL樹(shù)數(shù)據(jù)結(jié)構(gòu)輸入與輸出操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05C語(yǔ)言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實(shí)現(xiàn)
這篇文章主要介紹了怎樣用C語(yǔ)言模擬實(shí)現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語(yǔ)言中的一個(gè)復(fù)制字符串的庫(kù)函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同2022-05-05C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)
楊輝三角是中國(guó)古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來(lái),是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試2022-01-01純c實(shí)現(xiàn)異常捕獲try-catch組件教程示例
這篇文章主要為大家介紹了純c實(shí)現(xiàn)異常捕獲try-catch組件教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08