C 過載函式

2021-07-13 12:54:13 字數 2181 閱讀 3286

c++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,即函式的引數列表不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。

函式過載有什麼好處?

過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。當函式的編寫者充分考慮了不同情況下應該執行稍有不同的函式,函式的使用者就不必為這些小細節而煩惱了。

類的建構函式跟類名相同,也就是說:建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件,那是相當的麻煩!

例:

void print(int a)

void print(string a) //引數型別不一樣

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

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

void print(int a ,string b); //引數個數不同

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

所以,構成函式過載的條件如下:

1、函式名相同。

2、這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,即引數列表不同。

需要注意的是,返回值型別不同不構成過載函式。例:

char print(int a ,string b ,string b);

double print(double a);

//這兩個函式和以上的print函式都不是過載函式

過載函式的匹配原則:

1、嚴格匹配,找到後就呼叫。

2、沒有找到嚴格匹配的函式,但是可以通過隱式轉化,找到適合的過載函式。

例:

#include

#include

using

namespace

std;

void count(int a) //引數型別為int

void count(string a)//引數型別

int main()

通過隱式轉換可以將double轉為int,然後呼叫引數型別為int 的函式。

但是要注意乙個問題,就是隱式轉換的規則

而且要注意int到long和double,double到int和float的隱式轉換,會引發二義性(ambiguous)。就是有兩個都可行的選擇,計算機無法替你做選擇。(計算機也有選擇困難症啊。。。。)例:

#include

#include

using

namespace

std;

void count(double a)//形參型別為double

void count(long b)//形參型別為long

int main()

此時無法通過編譯。顯示 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的宣告階段。只有兩個階段同時進行才能匹配上。也就是要同時改名才可以。

具體的可參照其他大神部落格:

mysql 函式過載 C 方法過載(函式過載)

在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...

C 函式 函式過載

如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...

C 函式過載

函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...