C++對C語言的拓展(4)—— 函數重載
阿新 • • 發佈:2018-10-14
over 及其 尋求 所有 print har nbsp erro erl
函數重載(Function Overload):用同一個函數名定義不同的函數,當函數名和不同的參數搭配時函數的含義不同。
1、重載規則
(1)函數名相同;
(2)參數個數不同,參數的類型不同,參數順序不同,均可構成重載;
(3)返回值類型不同則不可以構成重載。
void func(int a);//OK void func(char a);//OK void func(char a,int b);//OK void func(int a,char b);//OK char func(int a);//與第一個函數有沖突
2、調用規則
(1)嚴格匹配,找到則調用;
(2)通過隱式轉換尋求一個匹配,找到則調用;
#include <iostream> using namespace std; void print1(double a) { cout << a << endl; } void print1(int a) { cout << a << endl; } int main(void) { print1(1);//1, print(int) print1(1.1);//1.1, print(double) print1(‘a‘);//,97, print(int) print1(1.11f);//1.11 print(double) return 0; }
編譯器調用重載函數的準則:
- 將所有同名函數作為候選者
- 嘗試尋找可行的候選函數
- 精確匹配實參
- 通過默認參數能夠匹配實參
- 通過默認類型轉換匹配實參
- 匹配失敗
- 最終尋找到的可行候選函數不唯一,則出現二義性,編譯失敗。
- 無法匹配所有候選者,函數未定義,編譯失敗。
3、重載底層實現(name mangling)
C++利用 name mangling(傾軋)技術,來改名函數名,區分參數不同的同名函數。
實現原理:用 v c i f l d 表示 void char int float long double 及其引用。
void func(char a);//func_c(char a) void func(char a,int b,double c);//func_cid(char a,int b,double c)
4、函數重載與函數默認參數
一個函數,不能既作重載,又作默認參數的函數。當你少寫一個參數時,系統無法確認是重載還是默認參數。
#include <iostream> using namespace std; int func(int a, int b, int c = 0) { return a*b*c; } int func(int a, int b) { return a+b; } int func(int a) { return a; } int main(void) { int c = 0; c = func(1, 2);//error,存在二義性,調用失敗,編譯不能通過 printf("c=%d\n", c); return 0; }
C++對C語言的拓展(4)—— 函數重載