C++函數重載

C++允許在同一範圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即函數的參數列表不同,也就是說用同一個運算符完成不同的運算功能。這就是重載函數。重載函數常用來實現功能類似而所處理的數據類型不同的問題。

函數重載有什麼好處?

重載函數通常用來命名一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的污染,對於程序的可讀性有很大的好處。當函數的編寫者充分考慮了不同情況下應該運行稍有不同的函數,函數的使用者就不必爲這些小細節而煩惱了。
類的構造函數跟類名相同,也就是說:構造函數都同名。如果沒有函數重載機制,要想實例化不同的對象,那是相當的麻煩!例如:

void print(int a)
{
    printf("void print(int a)\n");
}

void print(string a) //參數類型不一樣
{
printf("void print(string a)\n");
}

上面兩個就是重載的函數。調用函數時,通過對參數的識別從而調用不同的重載函數。例如在main函數中,如果給的參數是int,那麼就會調用上面的那個重載函數,如果給的參數是string,那麼就會調用下面的重載函數。

此外,參數個數和順序不同也能構成不同的重載函數。例:

void print(int a ,string b); //參數個數不同
void print(string a ,int b);//參數順序不同

所以,構成函數重載的條件如下:
1、函數名相同。
2、這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即參數列表不同。

需要注意的是,返回值類型不同不構成重載函數。例:

char   print(int a ,int b ,int c);
double print(int a ,int b ,int c);
//這兩個print函數不是重載函數;
//而下面兩個,忽略返回值,只看參數列表,構成了重載:
char   print(int a ,int b ,int c);
double print(int a ,char b);

重載函數的匹配原則:
1、嚴格匹配,找到後就調用。
2、沒有找到嚴格匹配的函數,但是可以通過隱式轉化,找到適合的重載函數。
例:

#include<iostream>
#include<stdio.h>
using namespace std;
void count(int a)   //參數類型爲int
{
    cout << "void count(int a)" << endl;
}
void count(string a)//參數類型
{
    cout << "void count(string a)" << endl;
}
int main()
{
    double min = 0.5;
    count(min); //實參爲double類型
    getchar();
    return 0;
}

通過隱式轉換可以將double轉爲int,然後調用參數類型爲int 的函數。
但是要注意一個問題,就是隱式轉換的規則。
而且要注意int到long和double,double到int和float的隱式轉換,會引發二義性(ambiguous)。就是有兩個都可行的選擇,計算機無法替你做選擇。(計算機也有選擇困難症啊。。。。)例:

#include<iostream>
#include<stdio.h>
using namespace std;
void count(double a)//形參類型爲double
{
    cout << "void count(double a)" << endl;
}
void count(long b)//形參類型爲long
{
    cout << "void count(long b)" << endl;
}
int main()
{
    int min = 10;
    count(min);//實參類型爲int
    getchar();
    return 0;
}

此時無法通過編譯。顯示 error C2668: “count”: 對重載函數的調用不明確。即,ambiguous。

下面簡單說說函數重載的原理:
C++採用命名傾軋(name mangling)的技術來改變同名函數,以區分參數不同的函數。
例:
void name(char a);通過傾軋->變成類似於void name_c;的形式。
void name(string a);通過傾軋->變成類似於void name_s;的形式。
void name(char a, int b);通過傾軋->變成類似於void name_ci;的形式。

name mangling 發生在兩個階段,一個是.cpp編譯時,一個是.h的聲明階段。只有兩個階段同時進行才能匹配上。也就是要同時改名纔可以。

發佈了53 篇原創文章 · 獲贊 76 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章