c 之函式過載

2021-08-03 08:45:06 字數 1816 閱讀 7251

一 概念

c++中函式過載是如何實現的呢?這個可以分解為下面兩個問題:

1.宣告/定義過載函式時,是如何解決命名衝突的?(拋開函式過載不談,using就是一種解決命名衝突的方法,解決命名衝突還有很多其它的方法,這裡就不論述了)

2.當我們呼叫乙個過載的函式時,又是如何去解析的?(即怎麼知道呼叫的是哪個函式呢)

在同一作用域類,一組函式的函式名相同,引數列表不同(個數不同/型別不同),返回值可同可不同。這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。

具體**如下:

通過上面**的實現,可以根據具體的print()的引數去呼叫print(int)還是print(string)。上面print(12)會去呼叫print(int),print(「hello world」)會去呼叫print(string),如下面的結果:

1.為什麼需要函式過載(why)?

試想如果沒有函式過載機制,如在c中,你必須要這樣去做:為這個print函式取不同的名字,如print_int、print_string。這裡還只是兩個的情況,如果是很多個的話,就需要為實現同乙個功能的函式取很多個名字,如加入列印long型、char*、各種型別的陣列等等。這樣做很不友好!

類的建構函式跟類名相同,也就是說:建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件,那是相當的麻煩!

操作符過載,本質上就是函式過載,它大大豐富了已有操作符的含義,方便使用,如+可用於連線字串等!

2、編譯器如何解決命名衝突的?

我們執行命令objdump -d a.out >log.txt反彙編並將結果重定向到log.txt檔案中,然後分析log.txt檔案

我們可以發現編譯之後,過載函式的名字變了不再都是print!

前面的z5表示返回值型別,print函式名,i表示整型int,ss表示字串string,即對映為返回型別+函式名+引數列表

3.編譯器是如何解析過載函式呼叫的?

編譯器實現呼叫過載函式解析機制的時候,肯定是首先找出同名的一些候選函式,然後從候選函式中找出最符合的,如果找不到就報錯。下面介紹一種過載函式解析的方法:編譯器在對過載函式呼叫進行處理時,由語法分析、c++文法、符號表、抽象語法樹互動處理,互動圖大致如下:

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

1.由匹配文法中的函式呼叫,獲取函式名;

2.獲得函式各引數表示式型別;

3.語法分析器查詢過載函式,符號表內部經過過載解析返回最佳的函式;

4.語法分析器建立抽象語法樹,將符號表中儲存的最佳函式繫結到抽象語法樹上.

詳情請見部落格連線

C 之 函式過載

函式的過載 函式的過載就是可以在乙個程式中使用同名的若干個函式。主要的限制是給定名稱的每個函式必須有不同的引數列表。也就是說,乙個引數列表中的引數型別與另乙個不同 不僅僅是引數名不同,實際上,如果滿足下列條件之一,兩個同名函式就是不同的 1.每個函式的引數個數不同 2.引數的個數相同,但至少有一對對...

C 之過載函式

c語言是實現不了過載的,只要兩個函式名稱相同,就會報錯,但是c 可以實現函式的過載,接下來我們看一下過載的規則。1.過載規則 1 函式名相同 2 引數的個數,型別,順序不同都可以構成過載 3 返回值型別不相同不可以構成過載 接下來我們看下具體的例子 void func int a void func...

C 之函式過載

c 允許功能相近的函式在相同的作用域內以相同函式名宣告,從而形成過載。方便使用,便於記憶。例 1 形參型別不同 int add int x,int y float add float x,float y 2 形參個數不同 int add int x,int y int add int x,int y...