C語(yǔ)言/C++編程學(xué)習(xí)排截,輕松解決C++函數(shù)重載

C語(yǔ)言是面向過(guò)程的断傲,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個(gè)結(jié)構(gòu)化語(yǔ)言认罩,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過(guò)一個(gè)過(guò)程宦搬,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過(guò)程(事務(wù))控制)间校。

C++杨幼,首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型差购,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問(wèn)題域汉嗽,這樣就可以通過(guò)獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過(guò)程(事務(wù))控制饼暑。 所以C與C++的最大區(qū)別在于它們的用于解決問(wèn)題的思想方法不一樣。之所以說(shuō)C++比C更先進(jìn)彰居,是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”陈惰。

C與C++的最大區(qū)別:在于它們的用于解決問(wèn)題的思想方法不一樣毕籽。之所以說(shuō)C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中 ”杯缺,而就語(yǔ)言本身而言睡榆,在C中更多的是算法的概念肉微。那么是不是C就不重要了,錯(cuò)勿负!算法是程序設(shè)計(jì)的基礎(chǔ)奴愉,好的設(shè)計(jì)如果沒(méi)有好的算法铁孵,一樣不行蜕劝。而且,“C加上好的設(shè)計(jì)”也能寫出非常好的東西暑始。

——c++里的狀況了是千姿百態(tài)每個(gè)狀況里面都會(huì)有以后影藏的本質(zhì)廊镜,關(guān)鍵是靠我們自己能否發(fā)現(xiàn)它的本質(zhì)

前方高能提醒:

函數(shù)重載的重要性不用說(shuō)大家都是知道嗤朴,但是你知道C++中函數(shù)重載是如何實(shí)現(xiàn)的嗎虫溜?(本文談的是C++中函數(shù)重載的實(shí)現(xiàn)重點(diǎn)衡楞,但我想其它語(yǔ)言也是類似的)容为?這樣就可以分解為下面兩個(gè)問(wèn)題

1、聲明/定義重載函數(shù)時(shí),是如何解決命名沖突的坎背?(拋開函數(shù)重載不談替劈,using就是一種解決命名沖突的方法,解決命名沖突還有很多其它的方法得滤,這里就不論述了)

2陨献、當(dāng)我們調(diào)用一個(gè)重載的函數(shù)時(shí)懂更,又是如何去解析的眨业?(即怎么知道調(diào)用的是哪個(gè)函數(shù)呢)

這兩個(gè)問(wèn)題是任何支持函數(shù)重載的語(yǔ)言都必須要解決的問(wèn)題!帶著這兩個(gè)問(wèn)題沮协,我們開始本文的探險(xiǎn)了龄捡。進(jìn)入正題請(qǐng)看下文:

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九,四七零慷暂,五九六 】聘殖,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)行瑞!裙內(nèi)有開發(fā)工具奸腺,很多干貨和技術(shù)資料分享!

1血久、例子引入(現(xiàn)象)

什么是函數(shù)重載(what)突照?

為什么需要函數(shù)重載(why)?

2氧吐、編譯器如何解決命名沖突的?

函數(shù)重載為什么不考慮返回值類型

3讹蘑、重載函數(shù)的調(diào)用匹配

模凌兩可的情況

4、編譯器是如何解析重載函數(shù)調(diào)用的筑舅?

根據(jù)函數(shù)名確定候選函數(shù)集

確定可用函數(shù)

確定最佳匹配函數(shù)

5座慰、總結(jié)

1、例子引入(現(xiàn)象)

1.1豁翎、什么是函數(shù)重載(what)角骤?

函數(shù)重載是指在同一作用域內(nèi)隅忿,可以有一組具有相同函數(shù)名心剥,不同參數(shù)列表的函數(shù),這組函數(shù)被稱為重載函數(shù)背桐。重載函數(shù)通常用來(lái)命名一組功能相似的函數(shù)优烧,這樣做減少了函數(shù)名的數(shù)量,避免了名字空間的污染链峭,對(duì)于程序的可讀性有很大的好處畦娄。

When two or more different declarations are specified for a single name in the same scope, that name is said to overloaded. By extension, two declarations in the same scope that declare the same name but with different types are called overloaded declarations. Only function declarations can be overloaded; object and type declarations cannot be overloaded. ——摘自《ANSI C++ Standard. P290》

看下面的一個(gè)例子,來(lái)體會(huì)一下:實(shí)現(xiàn)一個(gè)打印函數(shù),既可以打印int型熙卡、也可以打印字符串型杖刷。在C++中,我們可以這樣做:

#includeusing namespace std;void print(int i){cout<<"print a integer :"<

通過(guò)上面代碼的實(shí)現(xiàn)驳癌,可以根據(jù)具體的print()的參數(shù)去調(diào)用print(int)還是print(string)滑燃。上面print(12)會(huì)去調(diào)用print(int),print("hello world")會(huì)去調(diào)用print(string)颓鲜,如下面的結(jié)果:(先用g++ test.c編譯表窘,然后執(zhí)行)

看下面的一個(gè)例子,來(lái)體會(huì)一下:實(shí)現(xiàn)一個(gè)打印函數(shù)甜滨,既可以打印int型乐严、也可以打印字符串型。在C++中衣摩,我們可以這樣做:

#include

using namespace std;

void print(int i)

{

cout<<"print a integer :"<

}

void print(string str)

{

cout<<"print a string :"<

}

int main()

{

print(12);

print("hello world!");

return 0;

}

1.2昂验、為什么需要函數(shù)重載(why)?

試想如果沒(méi)有函數(shù)重載機(jī)制昭娩,如在C中凛篙,你必須要這樣去做:為這個(gè)print函數(shù)取不同的名字,如print_int栏渺、print_string呛梆。這里還只是兩個(gè)的情況,如果是很多個(gè)的話磕诊,就需要為實(shí)現(xiàn)同一個(gè)功能的函數(shù)取很多個(gè)名字填物,如加入打印long型、char*霎终、各種類型的數(shù)組等等滞磺。這樣做很不友好!

類的構(gòu)造函數(shù)跟類名相同莱褒,也就是說(shuō):構(gòu)造函數(shù)都同名击困。如果沒(méi)有函數(shù)重載機(jī)制,要想實(shí)例化不同的對(duì)象广凸,那是相當(dāng)?shù)穆闊?/p>

操作符重載阅茶,本質(zhì)上就是函數(shù)重載,它大大豐富了已有操作符的含義谅海,方便使用脸哀,如+可用于連接字符串等!

通過(guò)上面的介紹我們對(duì)函數(shù)重載扭吁,應(yīng)該喚醒了我們對(duì)函數(shù)重載的大概記憶撞蜂。下面我們就來(lái)分析盲镶,C++是如何實(shí)現(xiàn)函數(shù)重載機(jī)制的。

2蝌诡、編譯器如何解決命名沖突的?

為了了解編譯器是如何處理這些重載函數(shù)的溉贿,我們反編譯下上面我們生成的執(zhí)行文件,看下匯編代碼(全文都是在Linux下面做的實(shí)驗(yàn)浦旱,Windows類似顽照,你也可以參考《一道簡(jiǎn)單的題目引發(fā)的思考》一文,那里既用到Linux下面的反匯編和Windows下面的反匯編闽寡,并注明了Linux和Windows匯編語(yǔ)言的區(qū)別)代兵。我們執(zhí)行命令objdump -d a.out >log.txt反匯編并將結(jié)果重定向到log.txt文件中,然后分析log.txt文件爷狈。

發(fā)現(xiàn)函數(shù)void print(int i) 編譯之后為:(注意它的函數(shù)簽名變?yōu)椤?b>_Z5printi)

發(fā)現(xiàn)函數(shù)void print(string str) 編譯之后為:(注意它的函數(shù)簽名變?yōu)椤?b>_Z5printSs)

我們可以發(fā)現(xiàn)編譯之后植影,重載函數(shù)的名字變了不再都是print!這樣不存在命名沖突的問(wèn)題了涎永,但又有新的問(wèn)題了——變名機(jī)制是怎樣的思币,即如何將一個(gè)重載函數(shù)的簽名映射到一個(gè)新的標(biāo)識(shí)?我的第一反應(yīng)是:函數(shù)名+參數(shù)列表羡微,因?yàn)楹瘮?shù)重載取決于參數(shù)的類型谷饿、個(gè)數(shù),而跟返回類型無(wú)關(guān)妈倔。但看下面的映射關(guān)系:

void print(int i) -->?_Z5printi

void print(string str) -->?_Z5printSs

進(jìn)一步猜想博投,前面的Z5表示返回值類型,print函數(shù)名盯蝴,i表示整型int毅哗,Ss表示字符串string,即映射為返回類型+函數(shù)名+參數(shù)列表捧挺。最后在main函數(shù)中就是通過(guò)_Z5printi虑绵、_Z5printSs來(lái)調(diào)用對(duì)應(yīng)的函數(shù)的:

80489bc: e8 73 ff ff ff call 8048934?<_Z5printi>

……………

80489f0: e8 7a ff ff ff call 804896f?<_Z5printSs>

我們?cè)賹憥讉€(gè)重載函數(shù)來(lái)驗(yàn)證一下猜想,如:

void print(long l) -->?_Z5printl

void print(char str) -->?_Z5printc

可以發(fā)現(xiàn)大概是int->i闽烙,long->l翅睛,char->c,string->Ss….基本上都是用首字母代表黑竞,現(xiàn)在我們來(lái)現(xiàn)在一個(gè)函數(shù)的返回值類型是否真的對(duì)函數(shù)變名有影響捕发,如:

#includeusing namespace std;int max(int a,int b){ return a>=b?a:b;}double max(double a,double b){ return a>=b?a:b;}int main(){cout<<"max int is: "<

int max(int a,int b) 映射為_Z3maxii、double max(double a,double b) 映射為_Z3maxdd摊溶,這證實(shí)了我的猜想爬骤,Z后面的數(shù)字代碼各種返回類型充石。更加詳細(xì)的對(duì)應(yīng)關(guān)系莫换,如那個(gè)數(shù)字對(duì)應(yīng)那個(gè)返回類型霞玄,哪個(gè)字符代表哪重參數(shù)類型,就不去具體研究了拉岁,因?yàn)檫@個(gè)東西跟編譯器有關(guān)坷剧,上面的研究都是基于g++編譯器,如果用的是vs編譯器的話喊暖,對(duì)應(yīng)關(guān)系跟這個(gè)肯定不一樣惫企。但是規(guī)則是一樣的:“返回類型+函數(shù)名+參數(shù)列表”。

既然返回類型也考慮到映射機(jī)制中陵叽,這樣不同的返回類型映射之后的函數(shù)名肯定不一樣了狞尔,但為什么不將函數(shù)返回類型考慮到函數(shù)重載中呢?——這是為了保持解析操作符或函數(shù)調(diào)用時(shí)巩掺,獨(dú)立于上下文(不依賴于上下文)偏序,看下面的例子

float sqrt(float);double sqrt(double);void f(double da, float fla){ float fl=sqrt(da);//調(diào)用sqrt(double)double d=sqrt(da);//調(diào)用sqrt(double)fl=sqrt(fla);//調(diào)用sqrt(float)d=sqrt(fla);//調(diào)用sqrt(float)}

如果返回類型考慮到函數(shù)重載中,這樣將不可能再獨(dú)立于上下文決定調(diào)用哪個(gè)函數(shù)胖替。

至此似乎已經(jīng)完全分析清楚了研儒,但我們還漏了函數(shù)重載的重要限定——作用域。上面我們介紹的函數(shù)重載都是全局函數(shù)独令,下面我們來(lái)看一下一個(gè)類中的函數(shù)重載端朵,用類的對(duì)象調(diào)用print函數(shù),并根據(jù)實(shí)參調(diào)用不同的函數(shù):

#includeusing namespace std;class test{public: void print(int i){cout<<"int"<

我們現(xiàn)在再來(lái)看一下這時(shí)print函數(shù)映射之后的函數(shù)名:

void print(int i) --> _ZN4test5printEi

void print(char c) --> _ZN4test5printEc

注意前面的N4test燃箭,我們可以很容易猜到應(yīng)該表示作用域冲呢,N4可能為命名空間、test類名等等招狸。這說(shuō)明最準(zhǔn)確的映射機(jī)制為:作用域+返回類型+函數(shù)名+參數(shù)列表

3碗硬、重載函數(shù)的調(diào)用匹配

現(xiàn)在已經(jīng)解決了重載函數(shù)命名沖突的問(wèn)題,在定義完重載函數(shù)之后瓢颅,用函數(shù)名調(diào)用的時(shí)候是如何去解析的恩尾?為了估計(jì)哪個(gè)重載函數(shù)最適合,需要依次按照下列規(guī)則來(lái)判斷:

精確匹配:參數(shù)匹配而不做轉(zhuǎn)換挽懦,或者只是做微不足道的轉(zhuǎn)換翰意,如數(shù)組名到指針、函數(shù)名到指向函數(shù)的指針信柿、T到const T冀偶;

提升匹配:即整數(shù)提升(如bool 到 int、char到int渔嚷、short 到int)进鸠,float到double

使用標(biāo)準(zhǔn)轉(zhuǎn)換匹配:如int 到double、double到int形病、double到long double客年、Derived*到Base*霞幅、T*到void*、int到unsigned int量瓜;

使用用戶自定義匹配司恳;

使用省略號(hào)匹配:類似printf中省略號(hào)參數(shù)

如果在最高層有多個(gè)匹配函數(shù)找到,調(diào)用將被拒絕(因?yàn)橛衅缌x绍傲、模凌兩可)扔傅。看下面的例子:

void print(int);void print(const char*);void print(double);void print(long);void print(char);void h(char c,int i,short s, float f){print(c);//精確匹配烫饼,調(diào)用print(char)print(i);//精確匹配猎塞,調(diào)用print(int)print(s);//整數(shù)提升,調(diào)用print(int)print(f);//float到double的提升杠纵,調(diào)用print(double)print('a');//精確匹配邢享,調(diào)用print(char)print(49);//精確匹配,調(diào)用print(int)print(0);//精確匹配淡诗,調(diào)用print(int)print("a");//精確匹配骇塘,調(diào)用print(const char*)}

定義太少或太多的重載函數(shù),都有可能導(dǎo)致模凌兩可韩容,看下面的一個(gè)例子:

void f1(char);void f1(long);void f2(char*);void f2(int*);void k(int i){f1(i);//調(diào)用f1(char)款违? f1(long)?f2(0);//調(diào)用f2(char*)群凶?f2(int*)插爹?}

這時(shí)侯編譯器就會(huì)報(bào)錯(cuò),將錯(cuò)誤拋給用戶自己來(lái)處理:通過(guò)顯示類型轉(zhuǎn)換來(lái)調(diào)用等等(如f2(static_cast(0)请梢,當(dāng)然這樣做很丑赠尾,而且你想調(diào)用別的方法時(shí)有用做轉(zhuǎn)換)。上面的例子只是一個(gè)參數(shù)的情況毅弧,下面我們?cè)賮?lái)看一個(gè)兩個(gè)參數(shù)的情況:

int pow(int ,int);double pow(double,double);void g(){ double d=pow(2.0,2)//調(diào)用pow(int(2.0),2)? pow(2.0,double(2))?}

4气嫁、編譯器是如何解析重載函數(shù)調(diào)用的?

編譯器實(shí)現(xiàn)調(diào)用重載函數(shù)解析機(jī)制的時(shí)候够坐,肯定是首先找出同名的一些候選函數(shù)寸宵,然后從候選函數(shù)中找出最符合的,如果找不到就報(bào)錯(cuò)元咙。下面介紹一種重載函數(shù)解析的方法:編譯器在對(duì)重載函數(shù)調(diào)用進(jìn)行處理時(shí)梯影,由語(yǔ)法分析、C++文法庶香、符號(hào)表甲棍、抽象語(yǔ)法樹交互處理,交互圖大致如下:

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九赶掖,四七零感猛,五九六 】七扰,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)唱遭!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享呈驶!

這個(gè)四個(gè)解析步驟所做的事情大致如下:

由匹配文法中的函數(shù)調(diào)用拷泽,獲取函數(shù)名;

獲得函數(shù)各參數(shù)表達(dá)式類型袖瞻;

語(yǔ)法分析器查找重載函數(shù)司致,符號(hào)表內(nèi)部經(jīng)過(guò)重載解析返回最佳的函數(shù)

語(yǔ)法分析器創(chuàng)建抽象語(yǔ)法樹,將符號(hào)表中存儲(chǔ)的最佳函數(shù)綁定到抽象語(yǔ)法樹上

下面我們重點(diǎn)解釋一下重載解析聋迎,重載解析要滿足前面《3脂矫、重載函數(shù)的調(diào)用匹配》中介紹的匹配順序和規(guī)則。重載函數(shù)解析大致可以分為三步:

根據(jù)函數(shù)名確定候選函數(shù)集

從候選函數(shù)集中選擇可用函數(shù)集合

從可用函數(shù)集中確定最佳函數(shù)霉晕,或由于模凌兩可返回錯(cuò)誤

4.1庭再、根據(jù)函數(shù)名確定候選函數(shù)集

根據(jù)函數(shù)在同一作用域內(nèi)所有同名的函數(shù),并且要求是可見(jiàn)的(像private牺堰、protected拄轻、public、friend之類)伟葫『薮辏“同一作用域”也是在函數(shù)重載的定義中的一個(gè)限定,如果不在一個(gè)作用域筏养,不能算是函數(shù)重載斧抱,如下面的代碼:

void f(int);void g(){ void f(double);f(1); //這里調(diào)用的是f(double),而不是f(int)}

內(nèi)層作用域的函數(shù)會(huì)隱藏外層的同名函數(shù)渐溶!同樣的派生類的成員函數(shù)會(huì)隱藏基類的同名函數(shù)辉浦。這很好理解,變量的訪問(wèn)也是如此茎辐,如一個(gè)函數(shù)體內(nèi)要訪問(wèn)全局的同名變量要用“::”限定盏浙。

為了查找候選函數(shù)集,一般采用深度優(yōu)選搜索算法:

step1:從函數(shù)調(diào)用點(diǎn)開始查找,逐層作用域向外查找可見(jiàn)的候選函數(shù)

step2:如果上一步收集的不在用戶自定義命名空間中趟紊,則用到了using機(jī)制引入的命名空間中的候選函數(shù)癣猾,否則結(jié)束

在收集候選函數(shù)時(shí),如果調(diào)用函數(shù)的實(shí)參類型為非結(jié)構(gòu)體類型丐黄,候選函數(shù)僅包含調(diào)用點(diǎn)可見(jiàn)的函數(shù);如果調(diào)用函數(shù)的實(shí)參類型包括類類型對(duì)象孔飒、類類型指針灌闺、類類型引用或指向類成員的指針艰争,候選函數(shù)為下面集合的并:

(1)在調(diào)用點(diǎn)上可見(jiàn)的函數(shù);

(2)在定義該類類型的名字空間或定義該類的基類的名字空間中聲明的函數(shù);

(3)該類或其基類的友元函數(shù);

下面我們來(lái)看一個(gè)例子更直觀:

void f();void f(int);void f(double, double = 314);names pace N{void f(char3 ,char3);}classA{public: operat or double() { }};int main ( ){using names pace N; //using指示符A a;f(a); return 0;}

根據(jù)上述方法,由于實(shí)參是類類型的對(duì)象桂对,候選函數(shù)的收集分為3步:

(1)從函數(shù)調(diào)用所在的main函數(shù)作用域內(nèi)開始查找函數(shù)f的聲明甩卓, 結(jié)果未找到。到main函數(shù)

作用域的外層作用域查找蕉斜,此時(shí)在全局作用域找到3個(gè)函數(shù)f的聲明逾柿,將它們放入候選集合;

(2)到using指示符所指向的命名空間 N中收集f ( char3 , char3 ) 宅此;

(3)考慮2類集合机错。其一為定義該類類型的名字空間或定義該類的基類的名字空間中聲明的函

數(shù);其二為該類或其基類的友元函數(shù)父腕。本例中這2類集合為空弱匪。

最終候選集合為上述所列的 4個(gè)函數(shù)f。

4.2璧亮、確定可用函數(shù)

可用的函數(shù)是指:函數(shù)參數(shù)個(gè)數(shù)匹配并且每一個(gè)參數(shù)都有隱式轉(zhuǎn)換序列萧诫。

(1)如果實(shí)參有m個(gè)參數(shù),所有候選參數(shù)中枝嘶,有且只有 m個(gè)參數(shù)财搁;

(2)所有候選參數(shù)中,參數(shù)個(gè)數(shù)不足m個(gè)躬络,當(dāng)前僅當(dāng)參數(shù)列表中有省略號(hào)尖奔;

(3)所有候選參數(shù)中,參數(shù)個(gè)數(shù)超過(guò) m個(gè)穷当,當(dāng)前僅當(dāng)?shù)趍 + 1個(gè)參數(shù)以后都有缺省值提茁。如果可用

集合為空,函數(shù)調(diào)用會(huì)失敗馁菜。

這些規(guī)則在前面的《3茴扁、重載函數(shù)的調(diào)用匹配》中就有所體現(xiàn)了。

4.3汪疮、確定最佳匹配函數(shù)

確定可用函數(shù)之后峭火,對(duì)可用函數(shù)集中的每一個(gè)函數(shù),如果調(diào)用函數(shù)的實(shí)參要調(diào)用它計(jì)算優(yōu)先級(jí)智嚷,最后選出優(yōu)先級(jí)最高的卖丸。如對(duì)《3、重載函數(shù)的調(diào)用匹配》中介紹的匹配規(guī)則中按順序分配權(quán)重盏道,然后計(jì)算總的優(yōu)先級(jí)稍浆,最后選出最優(yōu)的函數(shù)。

5、總結(jié)

本文介紹了什么是函數(shù)重載衅枫、為什么需要函數(shù)重載嫁艇、編譯器如何解決函數(shù)重名問(wèn)題、編譯器如何解析重載函數(shù)的調(diào)用弦撩。通過(guò)本文步咪,我想大家對(duì)C++中的重載應(yīng)該算是比較清楚了。說(shuō)明:在介紹函數(shù)名映射機(jī)制是基于g++編譯器益楼,不同的編譯器映射有些差別猾漫;編譯器解析重載函數(shù)的調(diào)用,也只是所有編譯器中的一種偏形。如果你對(duì)某個(gè)編譯器感興趣静袖,請(qǐng)自己深入去研究觉鼻。

最后我拋給大家兩個(gè)問(wèn)題:

1俊扭、在C++中加號(hào)+,即可用于兩個(gè)int型之間的相加坠陈、也可以用于浮點(diǎn)數(shù)數(shù)之間的相加萨惑、字符串之間的連接,那+算不算是操作符重載呢仇矾?換個(gè)場(chǎng)景C語(yǔ)言中加號(hào)+庸蔼,即可用于兩個(gè)int型之間的相加、也可以用于浮點(diǎn)數(shù)數(shù)之間的相加贮匕,那算不算操作符重載呢姐仅?

2、模板(template)的重載時(shí)怎么樣的刻盐?模板函數(shù)和普通函數(shù)構(gòu)成的重載掏膏,調(diào)用時(shí)又是如何匹配的呢?

附錄:一種C++函數(shù)重載機(jī)制

這個(gè)機(jī)制是由張素琴等人提出并實(shí)現(xiàn)的敦锌,他們寫了一個(gè)C++的編譯系統(tǒng)COC++(開發(fā)在國(guó)產(chǎn)機(jī)上馒疹,UNIX操作系統(tǒng)環(huán)境下具有中國(guó)自己版權(quán)的C、C++和FORTRAN語(yǔ)言編譯系統(tǒng)乙墙,這些編譯系統(tǒng)分別滿足了ISOC90颖变、AT&T的C++85和ISOFORTRAN90標(biāo)準(zhǔn))。COC++中的函數(shù)重載處理過(guò)程主要包括兩個(gè)子過(guò)程:

1听想、在函數(shù)聲明時(shí)的處理過(guò)程中腥刹,編譯系統(tǒng)建立函數(shù)聲明原型鏈表,按照換名規(guī)則進(jìn)行換名并在函數(shù)聲明原型鏈表中記錄函數(shù)換名后的名字(換名規(guī)則跟本文上面描述的差不多汉买,只是那個(gè)int-》為哪個(gè)字符肛走、char-》為哪個(gè)字符等等類似的差異)

圖附1、過(guò)程1-建立函數(shù)鏈表(說(shuō)明,函數(shù)名的編碼格式為:<原函數(shù)名>_<作用域換名><函數(shù)參數(shù)表編碼>朽色,這跟g++中的有點(diǎn)不一樣)

2邻吞、在函數(shù)調(diào)用語(yǔ)句翻譯過(guò)程中,訪問(wèn)符號(hào)表葫男,查找相應(yīng)函數(shù)聲明原型鏈表抱冷,按照類型匹配原則,查找最優(yōu)匹配函數(shù)節(jié)點(diǎn)梢褐,并輸出換名后的名字下面給出兩個(gè)子過(guò)程的算法建立函數(shù)聲明原型鏈表算法流程如圖附1旺遮,函數(shù)調(diào)用語(yǔ)句翻譯算法流程如圖附2。

圖附2盈咳、過(guò)程2- 重載函數(shù)調(diào)用耿眉,查找鏈表

附-模板函數(shù)和普通函數(shù)構(gòu)成的重載,調(diào)用時(shí)又是如何匹配的呢鱼响?

下面是C++創(chuàng)始人Bjarne Stroustrup的回答:

1)Find the set of function template specializations that will take part in overload resolution.

2)if two template functions can be called and one is more specified than the other, consider only the most specialized template function in the following steps.

3)Do overload resolution for this set of functions, plus any ordinary functions as for ordinary functions.

4)If a function and a specialization are equally good matches, the function is perferred.

5)If no match is found, the call is an error.

小編推薦一個(gè)學(xué)C語(yǔ)言/C++的學(xué)習(xí)裙【 六九九鸣剪,四七零,五九六 】丈积,無(wú)論你是大牛還是小白筐骇,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具江滨,很多干貨和技術(shù)資料分享铛纬!

以上是我們今天總結(jié)的c++函數(shù)重載內(nèi)容

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能唬滑、云計(jì)算工程師告唆、信息安全(黑客反黑客)、大數(shù)據(jù) 晶密、數(shù)據(jù)平臺(tái)擒悬、嵌入式工程師、流媒體服務(wù)器惹挟、數(shù)據(jù)控解茄螃、圖像處理、音頻視頻開發(fā)工程師连锯、游戲服務(wù)器归苍、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末运怖,一起剝皮案震驚了整個(gè)濱河市拼弃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摇展,老刑警劉巖吻氧,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盯孙,警方通過(guò)查閱死者的電腦和手機(jī)鲁森,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)振惰,“玉大人歌溉,你說(shuō)我怎么就攤上這事∑锞В” “怎么了痛垛?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桶蛔。 經(jīng)常有香客問(wèn)我匙头,道長(zhǎng),這世上最難降的妖魔是什么仔雷? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任蹂析,我火速辦了婚禮,結(jié)果婚禮上朽寞,老公的妹妹穿的比我還像新娘识窿。我一直安慰自己斩郎,他們只是感情好脑融,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缩宜,像睡著了一般肘迎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锻煌,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天妓布,我揣著相機(jī)與錄音,去河邊找鬼宋梧。 笑死匣沼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捂龄。 我是一名探鬼主播释涛,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倦沧!你這毒婦竟也來(lái)了唇撬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤展融,失蹤者是張志新(化名)和其女友劉穎窖认,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扑浸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年烧给,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喝噪。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡创夜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仙逻,到底是詐尸還是另有隱情驰吓,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布系奉,位于F島的核電站檬贰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缺亮。R本人自食惡果不足惜翁涤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萌踱。 院中可真熱鬧葵礼,春花似錦、人聲如沸并鸵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)园担。三九已至届谈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弯汰,已是汗流浹背艰山。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咏闪,地道東北人曙搬。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸽嫂,于是被迫代替她去往敵國(guó)和親纵装。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容