C++深入講解函數(shù)重載
函數(shù)重載
概念
在C++中可以為兩個或者兩個以上函數(shù)提供相同的函數(shù)名稱,只要參數(shù)類型不同,或者參數(shù)數(shù)目不同,參數(shù)順序不同,即參數(shù)表不同,那么就認(rèn)為是函數(shù)的重載。(函數(shù)名+參數(shù)表)
// my_max + 參數(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; } //每個同名函數(shù)的參數(shù)表是惟一, int main() { int ix = my_max(12,23); double dx = my_max(12.23,34.45); char chx = my_max('a','b'); return 0; }
重載依據(jù)
- 可以用值型別和形參類型作為重載依據(jù)
- 函數(shù)的返回類型不同不能作為函數(shù)重載的依據(jù)
- 在定義重載函數(shù)時,不能輕易給出函數(shù)參數(shù)的默認(rèn)值,容易在調(diào)用時候產(chǎn)生二義性
值型別
函數(shù)的左值:和數(shù)據(jù)類型無關(guān),有名字并且可以取地址
函數(shù)的有值:字面常量,不能取地址的
右值引用: && ,可以引用字面常量,引用右值
int && r = 10; //可以引用字面常量
判斷函數(shù)重載的規(guī)則
1.如果兩個函數(shù)的參數(shù)表相同, 但是返回類型不同,會被標(biāo)記為編譯錯誤:函數(shù)的重復(fù)聲明。
int my_max(int a,int b) { return a > b ? a : b; } unsigned int my_max(int a,int b) // error; { return a > b ? a : b; } int main() { int ix = my_max(12,23); unsigned int = my_max(12,23); // error; reutrn 0; }
2.參數(shù)表的比較過程與形參名無關(guān)。
// 聲明同一個函數(shù) int my_add(int a,int b); int my_add(int x,int y);
3.如果在兩個函數(shù)的參數(shù)表中,只有缺省實參不同,則第二個聲明被視為第一個的重復(fù)聲明
void Print(int *br,int n); void Print(int *br,int len = 10);
4.typedef 名為現(xiàn)有的數(shù)據(jù)類型提供了一個替換名,它并沒有創(chuàng)建一個新類型 ,因此 ,如果兩個函數(shù)參數(shù)表的區(qū)別只在于一個使用了 typedef ,而另一個使用了與 typedef 相應(yīng)的類型。則該參數(shù)表被視為相同的參數(shù)列表。
typedef unsigned int u_int; int Print(u_int a) int Print(unsigned int b);
5.當(dāng)一個形參類型有 const 或 volatile 修飾時,如果形參是按值傳遞方式定義,在識別函數(shù)聲明是否相同時,并不考慮 const 和 volatile 修飾符.
void fun(int a){ } void fun(const int a) { }
6.當(dāng)一個形參類型有 const 或 volatile 修飾時,如果形參定義指針或引用時,在識別函數(shù)聲明是否相同時 ,就要考慮 const 和 volatile 修飾符.
void fun(int *p) {} void fun(const int *p) {} void fun(int &a) {} void fun(const int &a) {}
7.注意函數(shù)調(diào)用的二義性;
如果在兩個函數(shù)的參數(shù)表中,形參類型相同,而形參個數(shù)不同,形參默認(rèn)值將會影響函數(shù)的重載
void fun(int a){} void fun(int a,int b){} void fun(int a ,int b = 10);
8.函數(shù)重載解析的步驟如下
- 確定函數(shù)調(diào)用考慮的重載函數(shù)的集合, 確定函數(shù)調(diào)用中實參表的屬性.
- 從重載函數(shù)集合中選擇函數(shù) ,該函數(shù)可以在 (給出實參個數(shù)和類型 )的情況下可以調(diào)用函數(shù).
- 選擇與調(diào)用最匹配的函數(shù).
名字粉碎-名字修飾
“C”或者“C++”函數(shù)在內(nèi)部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數(shù)定義或者原型時生成的字符串。
修飾名由函數(shù)名、類名、調(diào)用約定、返回類型、參數(shù)等共同決定。
調(diào)用約定:
C調(diào)用約定(即用 __cdecl 關(guān)鍵字說明)按從右至左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出棧。
對于傳送參數(shù)的內(nèi)存棧是由調(diào)用者來維護(hù)的(正因為如此,實現(xiàn)可變參數(shù)的函數(shù)只能使用該調(diào)用約
定)。
在C/C++中,一個程序要運行起來,需要經(jīng)歷以下幾個階段:預(yù)編譯(預(yù)處理)、編譯、匯編、鏈
接。Name Mangling是一種在編譯過程中,將函數(shù)名、變量名的名字重新命名的機(jī)制。
C 語言編譯時函數(shù)名修飾約定規(guī)則
C語言的名字修飾規(guī)則非常簡單,__cdecl是C/C++的缺省調(diào)用方式, 調(diào)用約定函數(shù)名字前面添加了下
劃線前綴。
格式:_functionname
C++編譯時函數(shù)名修飾約定規(guī)則:
__cdecl 調(diào)用約定:
1、以“?”標(biāo)識函數(shù)名的開始,后跟函數(shù)名;
2、函數(shù)名后面以“@@YA”標(biāo)識參數(shù)表的開始,后跟參數(shù)表;
3、參數(shù)表以代號表示:
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-- 表示指針,后面的代號表明指針類型,如果相同類型的指針連續(xù)出現(xiàn),以“ 0 ”代替,一個“ 0 ”代表
一次重復(fù);
4、參數(shù)表的第一項為該函數(shù)的返回值類型,其后依次為參數(shù)的數(shù)據(jù)類型,指針標(biāo)識在其所指數(shù)據(jù)類型前;
5、參數(shù)表后以“@Z”標(biāo)識整個名字的結(jié)束,如果該函數(shù)無參數(shù),則以“ Z ”標(biāo)識結(jié)束。
//(?my_add_int@@YGHHH@Z) int __stdcall my_add_int(int a, int b) { return a + b; } //(?print_int@@YAXH@Z) void __cdecl print_int(int a) { printf("%d ", a); } // (?fun@@YIXXZ) void __fastcall fun() { } int main() { my_add_int(12, 23); print_int(12); fun(); return 0; }
C++函數(shù)是重載
//(?my_max@@YAHHH@Z) int my_max(int a, int b); //(?my_max@@YADDD@Z) char my_max(char a, char b); //(?my_max@@YANNN@Z) double my_max(double a, double b); int main() { my_max(12, 23); my_max('a', 'b'); my_max(12.23, 34.45); return 0; }
到此這篇關(guān)于C++深入講解函數(shù)重載的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
生成隨機(jī)數(shù)rand函數(shù)的用法詳解
本篇文章是對生成隨機(jī)數(shù)rand函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05MFC擴(kuò)展DLL中導(dǎo)出類和對話框的實現(xiàn)方法
這篇文章主要介紹了MFC擴(kuò)展DLL中導(dǎo)出類和對話框的實現(xiàn)方法,詳細(xì)講述了實現(xiàn)擴(kuò)展DLL中導(dǎo)出類和對話框的具體步驟與方法,具有不錯的實用價值,需要的朋友可以參考下2014-10-10簡單了解C語言中直接插入排序與直接選擇排序?qū)崿F(xiàn)
這篇文章主要介紹了C語言中直接插入排序與直接選擇排序?qū)崿F(xiàn),插入排序的基本操作就是將一個數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個新的、個數(shù)加一的有序數(shù)據(jù),需要的朋友可以參考下2016-03-03