C 過載函式

2021-08-09 22:31:00 字數 3126 閱讀 8229

定義

如果在同一作用域內的幾個函式名字相同但是形參列表不同,我們稱之為過載函式

從過載函式的定義上來看,它們應該在形參數量或者形參型別上有所不同,和返回值的型別沒有任何關係

注:main 函式不能過載

過載和const 形參

形參為值變數

int fun(int a){}

int fun(const

int a){} //重複定義fun

定義為const的變數,只是把當做左值進行修改時,才會報錯。因此,加上const 關鍵字是否構成過載就看在函式的定義中形參的意義是否相同。

在下面fun()函式中,假如有乙個實參i,向形參傳值的過程中,可以將乙個普通變數賦值給常量,和乙個普通變數賦值給第乙個函式中的形參無任何區別。故上面兩個函式不構成過載。

在c++編譯器中,我們做實驗驗證下:

#include

#include

using

namespace

std;

int fun(int a)

int fun(const

int a)

int main()

形參為指標變數

情況1

int fun(int

*a)int fun(const int

*a)

編寫如下的**:

#include

#include

using

namespace

std;

int fun(int *a)

int fun(const

int *a)

int main()

在函式匹配過程中,會根據實參進行最佳型別匹配,故而上面兩個函式可以進行過載。

情況2

int fun(int

*a)int fun(int const *a)

在情況1中,第二個函式的定義和情況2中第二個函式的定義相同,無任何區別。所以上面兩個函式也是可以過載的。

編寫如下的**進行驗證:

#include

#include

using

namespace

std;

int fun(int *a)

int fun(int

const *a)

int main()

結論同情況1

情況3

int fun(int *a)

int fun(int *const a) //錯誤,重複定義fun

測試**是這樣:

#include

#include

using

namespace

std;

int main()

即上面兩個函式的定義相同,不構成過載。

形參為引用變數

情況1

void func(int &a)

void func(const

int &a)

測試**:

#include

#include

using

namespace

std;

void func(int &a)

void func(const

int &a)

int main()

結論:雖然在主函式中引用的資料型別都是int,但是上述兩個函式可以構成過載。主要是因為當你傳常量引用時,不能用乙個非常量引用來引用乙個常量,所以上述fun()函式可以相互匹配。

情況2

void func(int &a)

void func(int

const &b)

測試**:

#include

#include

using

namespace

std;

void func(int &a)

void func(int

const &b)

int main()

結論同情況1

情況3

void func(int &a)

void func(int &const b)

測試**:

#include

#include

using

namespace

std;

void func(int &a)

void func(int &const b)

int main()

結論:上述兩個函式不構成過載。

總結在上面的分析中,我們可以看出:

(1)c++的形參可以傳值,傳指標,傳引用,同時可以給對應的形參加上const。

(2)在普通形參和const 形參是否構成過載,大致來看分為兩種情況:

如果是對於傳值,那麼普通傳值和const傳值不構成過載。編譯器對兩個的型別解析是相同的。(為什麼會這樣解析?應該能看原始碼吧,還沒到這個階段)

如果是對於指標傳值,那麼存在區別。對於

const

int *p=nullptr;

intconst *p=nullptr;

編譯器均解析為 int const *;

對於

int * const b=nullptr;
編譯器解析為int *

所以對於指標傳參,從型別上就可以區分出來是否構稱過載。

3. 如果對於引用,因為引用本身是別名,並不是乙個物件。因此,在上述測試**中,求引用的型別都是對引用的變數求型別。但是在傳參中是否構成過載函式,其實和指標的情況完全相同。

總結完畢,歡迎指正!

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,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...