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