天天看點

第八課:函數重載分析(上)

學習狄泰軟體學院唐老師C++課程心得,文章内容來自于唐老師課件

一、C++中的函數重載

函數重載

  • 用同一個函數名定義不同的函數
  • 當函數名和不同的參數搭配時函數的含義不同
#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

           

函數重載至少滿足下面的一個條件:

第八課:函數重載分析(上)
第八課:函數重載分析(上)
#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);
   //Error] call of overloaded 'func(int, int)' is ambiguous
    return 0;
}
           

編譯器調用重載函數的準則:

  • 将所有同名函數作為候選者
  • 嘗試尋找可行的候選函數
  • (1)精确比對實參
  • (2)通過預設參數能夠比對實參
  • (3)通過預設類型轉換比對實參
  • 比對失敗:
  • (1)最終尋找到的候選函數不唯一,則出現二義性,編譯失敗
  • (2)無法比對是以候選函數,函數未定義,編譯失敗
    第八課:函數重載分析(上)
#include <stdio.h>

int add(int a, int b)  // int(int, int)
{
    return a + b;
}



int main()
{
    printf("%p\n", add);
  

    return 0;
}
崩潰
           
第八課:函數重載分析(上)
第八課:函數重載分析(上)

總結:

第八課:函數重載分析(上)

繼續閱讀