1. 程式人生 > >C++筆記 第八課 函式過載分析(上)---狄泰學院

C++筆記 第八課 函式過載分析(上)---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習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++中通過函式名和函式引數確定函式呼叫