解析函式過載

2021-08-04 10:08:12 字數 1876 閱讀 2058

什麼是函式過載?

函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。

看下面的乙個例子,來體會一下:實現乙個列印函式,既可以列印int型、也可以列印字串型。在c++中,我們可以這樣做:

void print(int i)

通過上面**的實現,可以根據具體的print()的引數去呼叫print(int)還是print(string)。上面print(10)會去呼叫print(int),print("hello  ! ")會去呼叫print(string),如下面的結果:(先用g++ test.c編譯,然後執行)

c++是如何實現過載的?

為了了解編譯器是如何處理這些過載函式的,我們反編譯下上面我們生成的執行檔案,看下彙編**(全文都是在linux下面做的實驗)。我們執行命令objdump -d a.out >log.txt反彙編並將結果重定向到log.txt檔案中,然後分析log.txt檔案。

發現函式void print(int i) 編譯之後為:(注意它的函式簽名變為——_z5printi

發現函式void print(string str) 編譯之後為:(注意它的函式簽名變為——_z5printss

我們可以發現編譯之後,過載函式的名字變了不再都是print!這樣不存在命名衝突的問題了,但又有新的問題了——變名機制是怎樣的,即如何將乙個過載函式的簽名對映到乙個新的標識?我的第一反應是:函式名+引數列表,因為函式過載取決於引數的型別、個數,而跟返回型別無關。但看下面的對映關係:

void print(int i)                    -->_z5printi

void print(string str)         -->_z5printss

進一步猜想,前面的z5表示返回值型別,print函式名,i表示整型int,ss表示字串string,即對映為返回型別+函式名+引數列表。最後在main函式中就是通過_z5printi_z5printss來呼叫對應的函式的:

80489bc:       e8 73 ff ff ff          call   8048934<_z5printi>

…………… 

80489f0:       e8 7a ff ff ff          call   804896f<_z5printss>再有

intmax(

inta,

intb) 對映為

_z3maxii

、double

max(

double

a,double

b) 對映為

_z3maxdd,

這證實了我的猜想,z後面的數字**各種返回型別。規則是:「

返回型別

+函式名

+引數列表

」。

關於函式過載解析筆記001

當乙個函式在乙個特定的域中被多次宣告時,編譯器解析第二個及後面函式依照下面步驟 1.引數個數或型別不同,則認為是過載 過載函式 void print const string void print vector 2.函式返回型別和參數列完全相同,則認為第二個函式是第乙個函式的重複宣告 參數列的比較過...

解析成員函式過載 隱藏 覆蓋

概念 過載 在同乙個作用域下,函式名相同,但函式引數列表不同 引數個數,型別,順序 隱藏 指派生類成員函式遮蔽了與這個函式同名的基類中的函式。1 派生類成員函式與基類成員函式同名,但引數列表不同。2 派生類成員函式與基類成員函式同名,且引數列表相同,但基類中函式並沒有用virtual關鍵字修飾 覆蓋...

C 函式的模板與過載解析

模板是c 泛型程式設計的基礎,乙個模板就是乙個建立類或者函式的方案。在具體使用時,需要將模板引數轉化為具體型別。編譯器會對函式模板進行兩次編譯,在宣告的地方對模板本身進行編譯,在呼叫的地方對引數替換後的 進行編譯。c 提供兩種模板機制 函式模板和類模板,這裡我們只討論函式模板。1,例項化和具體化 為...