函式過載的原理

2021-10-02 06:34:46 字數 1750 閱讀 5364

在相同作用域中的多個函式,具有相同的名字而形參表不同。。

編譯器會根據呼叫引數的不一樣來選擇函式。

這個也叫做編譯時的多型。

過載函式是函式的一種特殊情況,為方便使用,c++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,也就是說用同乙個函式完成不同的功能。

先看乙個demo

#includeusing namespace std;

void func(int a)

void func(int a, int b)

int main()

我們發現可以呼叫到不同的函式。

那麼是怎麼做到的呢? 編譯器幫我們做了什麼事情呢?

我們先來看乙個函式的情況下,函式名在目標檔案發生了什麼變化

func.cpp

#includeusing namespace std;

void func(int a)

int main()

命令列輸入cmd

d:\studyproject\test>g++ -c func.cpp -o func.o

//objdump是反彙編的命令

我們修改下函式名字長度,看看發生了什麼變化?

發現目標檔案中的函式符號變了。

接下來我們看函式過載的情況下,是什麼樣子?

c++函式過載底層實現原理是c++利用name mangling(傾軋)技術,來改名函式名,區分引數不同的同名函式。

編譯器通過函式名和其引數型別識別過載函式。為了保證型別安全的連線(type-safe linkage),編譯器用引數個數和引數型別對每乙個函式識別符號進行專門編碼,這個過程有時稱為「名字改編」(name mangling)或「名字修飾」(name decoration)。型別安全的連線使得程式能夠呼叫合適的過載函式並保證了引數傳遞的一致性。編譯器能夠檢測到並報告連線錯誤。

補充

c++filt可以檢視原來的函式名稱

c 函式過載的原理

一 什麼是函式過載 函式過載是指在同一作用域內,可以有一組或者多組具有相同函式名,不同引數的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量及複雜度,避免了名字空間的汙染,對於程式的可讀性有很大的好處。具體的函式例子 include using name...

C 函式過載的實現原理

對於c 來說,多個函式可以同名,但是這些函式的引數型別必須不一樣,也就是說c 中相同的函式名函式引數不同代表了不同的函式,當你去呼叫這些函式時,編譯器可以根據你的傳入引數的型別去判斷你呼叫的是哪個函式。但是c 編譯器是怎麼實現的呢?先看看c對於函式的處理 執行命令 gcc s main c.c o ...

c 函式過載的實現原理

1.c 問什麼引入函式過載 在c語言中,如果我們寫兩個函式名相同的函式,編譯器會告訴我們,函式重定義的錯誤。我們還會遇到下面這個問題 如果我們寫乙個計算int型別的加法,另乙個計算double型別的加法,我們必須起兩個不同的函式名。而在c 中我們可以解決這兩個問題。我們可以用相同的函式名,只有引數列...