C++筆記 第八課 函式過載分析(上)---狄泰學院
阿新 • • 發佈:2018-11-06
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第八課 函式過載分析(上)
1.自然語言中的上下文
你知道下面詞彙中“洗”字的含義嗎?
結論:能和“洗”字搭配的詞彙有很多
“洗”字和不同的詞彙搭配有不同的含義
2.過載的概念(Overload)
同一個 識別符號在不同的上下文有不同的意義
如:“洗”和不同的詞彙搭配後有不同的含義
洗衣服,洗臉,洗腦。。。
“play”和不同的單詞搭配後有不同的含義
play chess,play paino,play basketball,…
3.思考:過載在自然語言中是隨處可見的。那麼程式設計中是否也有過載呢?有
4.C++中的函式過載(overloaded function)
用同一個函式名定義不同的函式(**)
當函式名和不同的引數搭配時函式的含義不同
8-1 函式過載初探
#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
函式過載至少滿足下面的一個條件:
引數個數不同、引數型別不同、引數順序不同
上面的兩個函式可以構成過載函式嗎?可以,引數順序不同
問題:當函式預設引數遇上函式過載會發生什麼?error,發生衝突
8-2 函式預設引數VS函式過載
編譯器呼叫過載函式的準則
將所有同名函式作為候選者
嘗試尋找可行的候選函式
精確匹配實參
通過預設引數能夠匹配實參
通過預設型別轉換匹配實參
匹配失敗
最終尋找到的候選函式不唯一,則出現二義性,編譯失敗
無法匹配所有候選者,函式未定義,編譯失敗
函式過載的注意事項
過載函式在本質上是相互獨立的不同函式
過載函式的函式型別不同
函式返回值不能作為函式過載的依據
函式過載是由函式名和引數列表決定的
8-3 函式過載的本質(**)
#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;
}
執行結果:兩個add函式入口地址不同
0x400526
0x40053a
符號表中的表示 識別符號
小結
函式過載是C++中引入的概念
函式過載用於模擬自然語言中的詞彙匹配
函式過載使得C++具有更豐富的語義表達能力
函式過載的本質為相互獨立的不同函式
(**)C++中通過函式名和函式引數確定函式呼叫