c++學習筆記(三)

StaDark發表於2024-06-24

函式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;
}

相關文章