1. 程式人生 > >C++函數的升級下_5

C++函數的升級下_5

函數重載 能夠 相互 turn 失敗 class pla ++ 個數

一。重載(Overload)

  1.同一個標識符在不同的上下文有不同的意義

  如:“洗”不同的含義

    - 洗衣服、洗臉、洗腦

  如:“play”和不同的單詞搭配後不同的含義

    -play chess, play piano

  2.函數重載(Function Overload)

    a.用同一個函數名定義不同的函數

    b.當函數名和不同的參數搭配時函數的含義不同

      int func(int x)

      int func (int a, int b )

      int func(const char* s )

  3.函數重載至少滿足下面一個條件

    a。參數個數不同

    b. 參數類型不同

    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 func(int a, const char* s)
{
    return a;
}

int func(const char* s, int a)
{
    
return strlen(s); } int main(int argc, char *argv[]) { int c = 0; c = func("ab", 1); printf("c = %d\n", c); printf("Press enter to continue ..."); getchar(); return 0; }

  4.函數默認參數遇上函數重載會發生什麽?

#include <stdio.h>
#include <string.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 = 0; c = func(1, 2); // 存在二義性,調用失敗,編譯不能通過 printf("c = %d\n", c); printf("Press enter to continue ..."); getchar(); return 0; }

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

  a.將所有同名函數作為候選者

  b.嘗試尋找可行的候選函數

    #精確匹配實參

    #通過默認參數能夠匹配實參

    #通過默認類型轉換匹配實參

  c.匹配失敗

    #最終尋找到的可行候選函數不唯一,若出現二義性,編譯失敗

    #無法匹配所有的候選者,函數未定義,編譯失敗。

6.函數重載的註意事項

  #重載函數在本質上是相互獨立的不同函數

  #重載函數的類型是不同的

  #函數返回值不能作為函數重載的依據

7.下面程序中哪個函數將被調用

  

#include <stdio.h>
#include <string.h>

int func(int x) // int(int a)
{
    return x;
}

int func(int a, int b)
{
    return a + b;
}

int func(const char* s)
{
    return strlen(s);
}

typedef int(*PFUNC)(int a); // int(int a)

int main(int argc, char *argv[])
{
    int c = 0;
    PFUNC p = func;
    
    c = p(1);
    
    printf("c = %d\n", c);
    
    printf("Press enter to continue ...");
    getchar();    
    return 0;
}

  輸出結果C = 1

7.函數重載與函數指針

  #當使用重載函數名與函數指針進行幅值時

    a.根據重載規則挑選與函數指針參數列表一致的候選者

    b.嚴格匹配候選者的函數類型和函數指針的函數類型

二。C++和C的相互調用

  1.在項目中融合C++和C代碼是實際工程中不可避免的

  2.雖然C++編譯器能夠兼容C語言的編譯方式,但C++編譯器會優先使用C++的方式進行編譯。

  3.利用extern關鍵字強制讓C++編譯器對代碼進行C方式編譯

   例:  extern

C++函數的升級下_5