關於函式過載

2021-08-10 08:36:52 字數 2156 閱讀 4523

什麼是函式過載

所謂函式過載是指同乙個函式名可以對應著多個函式的實現。例如,可以給函式名add()定義多個函式實現,如果乙個函式實現是求兩個整數之和,另乙個實現是求兩個實數之和,再乙個實現是求兩個複數之和。每種實現對應著乙個函式體,這些函式的名字相同,但函式的引數型別不同。

為什麼要有過載

假如我們在c語言中要定義乙個列印print函式,它可以輸出整型,字元型,字串。雖然這些函式的功能類似,我們必須將他們宣告成不同的名字讓編譯器進行區分,比如:

void print_int(int a);

void print_char(char c);

void print_string(char *str);

而在c++中我們可以利用函式過載以便於將這些函式的名字統一起來:

void print(int a);

void print(char c);

void print(char *str);

通過編譯器自動識別,可以使用同乙個函式名,執行不同的函式。

引數型別不同的過載函式

①兩個int型資料求和的函式實現

②兩個double型資料求和的函式實現

引數個數不同的函式過載

在使用引數時根據實參的個數來選取不同的函式實現

相同的函式名不會出現混亂嗎

在程式進行編譯期間,編譯器會對函式進行重新命名,因為c++中有過載的概念,所以編譯器在對c和c++中的函式進行重新命名時的規則一定不同。

首先在屬性頁中確定生成對映檔案。編譯之後會在專案中的debug檔案中會生成.map檔案,開啟就可以看到編譯器為函式進行的重新命名。

下圖表明編譯器對過載函式的重新命名是不同的

編譯器如何解析過載函式呼叫?

一組過載函式有多個,我們需要以合理的實參呼叫它們。編譯器首先將呼叫的實參與過載集合中每乙個函式的形參進行比較,然後根據比較結果確定要呼叫哪個函式。

函式匹配(過載確定):把函式呼叫與我們要呼叫的函式關聯起來,注意這時候已經確定我們要呼叫這組函式中的哪乙個了。

當呼叫過載函式時有三種情況:

1、編譯器找到乙個與實參最佳匹配的函式,並呼叫這個函式。

例如: add(2,3)呼叫的就是int add(int,int).

2、找不到任何乙個函式的引數與呼叫的實參匹配,此時編譯器會發出無法匹配的錯誤。

例如: add("abc","def") 就是錯誤的。

3、有多於乙個函式可以匹配,但是每乙個都不是明顯的最佳選擇,此時回發生錯誤。(二義性呼叫)

例如:int add(int,int);

int add(flaot,int);

add(3.6f,3.1f)就是二義性呼叫。

呼叫匹配:

精確匹配,引數匹配不做轉化,例如add(2,3)呼叫的是int add(int,int).

提公升匹配:即整數提公升,例如add(2.3,3.2)呼叫int add(int,int)。2.3和3.2都提公升成int型。

關於C 函式過載

c 函式過載是使用形參作為特徵標,寫這篇文章是說明一下const作為函式過載特徵的情況 1 形參為引用時 void func const int val void func int val int main 2 形參為指標時 void func int p void func const int p...

關於C 的函式過載

函式過載是c 的新特性,那到底為什麼c 可以而c卻不行呢?原因在於c 編譯器會執行名稱矯正或者叫做名稱修飾。例如,可能將myfunc int 轉換為 myfunc i,而將myfunc double 轉換為 myfunc d 實際上會轉換為帶有 及亂碼的複雜形式,這裡為了便於說明,採用這種形式 而c...

關於函式過載的理解

兩個以上的函式,具有相同的函式名,但是形參的個數或者型別不同,編譯器根據實參和形參的型別及個數的最佳匹配,自動確定呼叫哪乙個函式,這就是函式的過載。過載函式的形參定義時注意事項 個數不同型別不同不以形參名來區分函式不以返回值來區分函式 1,形參個數不同 int add int x,int y int...