1. 程式人生 > >第8課-函式過載分析(上)

第8課-函式過載分析(上)

一、過載的概念

過載(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++中通過函式名函式引數確定函式呼叫