定義
如果在同一作用域內的幾個函式名字相同但是形參列表不同,我們稱之為過載函式。
從過載函式的定義上來看,它們應該在形參數量或者形參型別上有所不同,和返回值的型別沒有任何關係
注: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,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...