什麼是函式過載
所謂函式過載是指同乙個函式名可以對應著多個函式的實現。例如,可以給函式名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...