第8課-函式過載分析(上)
阿新 • • 發佈:2018-12-12
一、過載的概念
過載(Overload):同一識別符號在不同的上下文有不同的意義
二、C++中的函式過載
函式過載(Function Overload)
- 用同一個函式名定義不同的函式
- 當函式名和不同的引數搭配時函式的含義不同
int func(int x){
return x;
}
int func(int a,int b){
return a + b;
}
int func(const char* s){
return strlen(s);
}
程式設計實驗:函式過載初探
#include <stdio.h>
#include <string.h>
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
int main(int argc, char *argv[])
{
printf("%d\n", func(3));
printf("%d\n", func(4, 5));
printf("%d\n", func("D.T.Software"));
return 0;
}
列印結果:
3
9
12
- 函式過載至少滿足下面的一個條件:
- 引數個數不同
- 引數型別不同
- 引數順序不同
程式設計實驗:函式預設引數vs函式過載
#include <stdio.h>
int func(int a, int b, int c = 0)
{
return a * b * c;
}
int func(int a, int b)
{
return a + b;
}
int main(int argc, char *argv[])
{
int c = func(1 , 2);
return 0;
}
此時編譯器會報錯,提示第16行執行失敗,因為無法選擇呼叫哪個函式
- 編譯器呼叫過載函式的準則
- 將所有同名函式作為候選者
- 嘗試尋找可行的候選函式
- 精確匹配實參
- 通過預設引數能夠匹配實參
- 通過預設型別轉換匹配實參
- 匹配失敗
- 最終尋找到的候選函式不唯一,則出現二義性,編譯失敗
- 無法匹配所有候選者,函式未定義,編譯失敗
函式過載的注意事項
- 過載函式在本質上是相互獨立的不同函式
- 過載函式的函式型別不同
- 函式返回值不能作為函式過載的依據
函式過載是由函式名和引數列表決定的
程式設計實驗:函式過載的本質
#include <stdio.h>
int add(int a, int b) // int(int, int)
{
return a + b;
}
int add(int a, int b, int c) // int(int, int, int)
{
return a + b + c;
}
int main()
{
printf("%p\n", (int(*)(int, int))add); //提取函式的位置
printf("%p\n", (int(*)(int, int, int))add);
return 0;
}
列印結果:
0000000000401530
0000000000401544
三、總結
- 函式過載是C++中引入的概念
- 函式過載用於模擬自然語言中的詞彙搭配
- 函式過載使得C++具有更豐富的語義表達能力
- 函式過載的本質為相互獨立的不同函式
- C++中通過函式名和函式引數確定函式呼叫