函式PLUS
函式預設引數
在c++中,函式的形參列表中的形參是可以有預設值的。呼叫函式時,如果未傳遞引數的值(傳入引數為空),則會使用預設值,如果指定了值,則會忽略預設值,使用傳遞的值。
語法:返回值型別 函式名 (引數 = 預設值) { }
int func(int a, int b = 10, int c = 20)
{
return a + b +c;
}
//1.如果某個位置引數有預設值,那麼從這個位置往後,從左到右,必須有預設值
//2.如果函式宣告有預設值,那麼函式實現的時候就不能有預設引數
int func2(int a = 10, int b = 20);
int func2(int a, int b)
{
return a + b;
}
函式佔位引數
c++中函式的形參列表裡可以有佔位引數,用來做佔位,呼叫函式時必須填補該位置
語法:返回值型別 函式名 (資料型別) { }
現階段函式的佔位引數一樣不大,但後續會用到
//函式佔位引數,佔位引數也可以有預設引數
int func(int a, int)
{
cout<<"this is func"<<endl
}
int main()
{
func(10,10);//佔位引數必須填補
return 0;
}
函式過載
作用:使函式名可以相同,提高複用性
需滿足條件:
- 在同一個作用域下
- 函式名相同
- 函式引數型別不同,或者個數不同,順序不同
Tips:函式的返回值不能作為函式過載的條件
void func(int a){
cout<<"func(int a)"<<endl;
}
void func(double a){//型別不同
cout<<"func(double a)"<<endl;
}
void func(int a, double b){//個數不同
cout<<"func(int a, double b)"<<endl;
}
void func(int b, double a){//順序不同
cout<<"func(int b, double a)"<<endl;
}
int func(int b, double a){//錯誤的,雖然這裡返回值型別為int與上面的void不同,但不能作為函式過載的條件
cout<<"func(int b, double a)"<<endl;
}
函式過載的注意事項
//1.引用作為過載的條件
void func(int &a) //int &a = 10; 不合法
{
cout<<"func(int &a)"<<endl;
}
void func(const int &a)
{
cout<<"func(const int &a)"<<endl;//const int &a = 10; 合法
}
//2.函式過載遇到預設函式
void func2(int a, int b = 10)
{
cout<<"func(int a, int b = 10)"<<endl;
}
void func2(int a)
{
cout<<"func(int a)"<<endl;
}
int main()
{
int a = 10;
func(a);//呼叫func(int &a)
func(10);//呼叫func(const int &a)
//記憶體空間分配的原因
func2(10);//此處程式碼報錯
func2(10, 10)//程式碼不報錯
//當函式過載遇到預設引數時會出現二義性(有歧義),有預設引數的函式儘量避免函式過載
return 0;
}