1. 程式人生 > >C++對C語言的拓展(4)—— 函數重載

C++對C語言的拓展(4)—— 函數重載

over 及其 尋求 所有 print har nbsp erro erl

  函數重載(Function Overload):用同一個函數名定義不同的函數,當函數名和不同的參數搭配時函數的含義不同。

1、重載規則

(1)函數名相同;

(2)參數個數不同,參數的類型不同,參數順序不同,均可構成重載;

(3)返回值類型不同則不可以構成重載。

void func(int a);//OK
void func(char a);//OK
void func(char a,int b);//OK
void func(int a,char b);//OK
char func(int a);//與第一個函數有沖突

2、調用規則

(1)嚴格匹配,找到則調用;

(2)通過隱式轉換尋求一個匹配,找到則調用;

#include <iostream>
using namespace std;

void print1(double a)
{
    cout << a << endl;
}
void print1(int a)
{
    cout << a << endl;
}
int main(void)
{
    print1(1);//1,    print(int)
    print1(1.1);//1.1,    print(double)
    print1(a);//,97,    print(int)
    print1(1.11f
);//1.11 print(double) return 0; }

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

  1. 將所有同名函數作為候選者
  2. 嘗試尋找可行的候選函數
  3. 精確匹配實參
  4. 通過默認參數能夠匹配實參
  5. 通過默認類型轉換匹配實參
  6. 匹配失敗
  7. 最終尋找到的可行候選函數不唯一,則出現二義性,編譯失敗。
  8. 無法匹配所有候選者,函數未定義,編譯失敗。

3、重載底層實現(name mangling)

  C++利用 name mangling(傾軋)技術,來改名函數名,區分參數不同的同名函數。

  實現原理:用 v c i f l d 表示 void char int float long double 及其引用。

void func(char a);//func_c(char a)
void func(char a,int b,double c);//func_cid(char a,int b,double c)

4、函數重載與函數默認參數

一個函數,不能既作重載,又作默認參數的函數。當你少寫一個參數時,系統無法確認是重載還是默認參數。

#include <iostream>
using namespace std;

int func(int a, int b, int c = 0)
{
    return a*b*c;
}

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

int func(int a)
{
    return a;
}
int main(void)
{
    int c = 0;
    c = func(1, 2);//error,存在二義性,調用失敗,編譯不能通過
    printf("c=%d\n", c);
    return 0;
}

C++對C語言的拓展(4)—— 函數重載