1. 程式人生 > 其它 >C++核心程式設計 3 函式提高

C++核心程式設計 3 函式提高

函式預設引數

  在C++中,函式的形參列表中的形參是可以有預設值的;

語法:返回值型別函式名 (引數 =預設值){ }

例項:

#include<iostream>
using namespace std;

//函式預設引數

int func1(int a, int b = 20, int c = 30)   //語法:返回值型別 函式名 (引數 = 預設值){ }
{
    return a + b + c;
}

//注意事項
//1、如果某個位置已經有了預設引數,那麼從這個位置往後,從左到右都必須有預設引數

/*
int func2(int a, int b = 10, int c, int d)  ---->    int func2(int a, int b = 10, int c = 20, int d = 30)
{
    return a + b + c;
}
*/ //2、如果函式宣告中有預設引數,函式實現就不能有預設引數 //宣告和實現只能有一個有預設引數 int func2(int a = 10, int b = 10); // <---- int func2(int a, int b); int func2(int a, int b) // <---- int func2(int a = 10, int b = 10) { return a + b; } int main() { //cout << func1(10 , 20) << endl; //如果我們自己傳入資料,就用自己的資料,如果沒有,那麼用預設值
cout << func2() << endl; system("pause"); return 0; }

函式佔位引數
  C++中函式的形參列表裡可以有佔位引數,用來做佔位,呼叫函式時必須填補該位置

語法:返回值型別函式名 (資料型別){ }

例項:

#include<iostream>
using namespace std;

//函式佔位

void func(int a , int)   //語法:返回值型別 函式名 (資料型別){ }
{
    cout << "this is func" << endl;
}


int main() { func(1,1); system("pause"); return 0; }

函式過載

作用:函式名可以相同,提高複用性

     函式過載滿足條件:

       1、同一個作用域下;

      2、函式名相同;

       3、函式引數型別不同,或者個數不同,或者順序不同;

注意:函式的返回值不可以作為函式過載的條件

例項:

#include<iostream>
using namespace std;

//函式過載

//函式過載的滿足條件
//1、同一個作用域下   滿足:都在全域性作用域
//2、函式名相同       滿足:都叫func()

void func(double a, int b)   //全域性作用域
{
    cout << "func(double a, int b)的呼叫" << endl;
}

//3、函式引數型別不同,或者個數不同,或者順序不同

void func(double a, double b)   //函式引數型別不同
{
    cout << "func(double a, double b)的呼叫!" << endl;
}

void func(double a, int b, int c)   //函式引數個數不同
{
    cout << "func(double a, int b, int c)的呼叫!" << endl;
}

void func(int a, double b)   //函式引數順序不同
{
    cout << "func(int a, double b)的呼叫" << endl;
}

int main()
{
    func(1.0, 2);
    func(1.0, 2.0);    //根據傳入引數的的不同,而呼叫不同的函式
    func(1.0, 2, 3);
    func(1, 2.0);

    system("pause");
    return 0;
}

函式過載注意事項

    1、引用作為過載條件;

例項:

#include<iostream>
using namespace std;

//函式過載的注意事項

//1、引用作為過載條件

void func(int &a)   // int &a = 10;  不合法 引用必須是合法的記憶體空間,不能是常量
{
    cout << "func(int &a)的呼叫" << endl;
}

void func(const int &a)   //const int &a = 10;   合法 加上const 編譯器做了一層優化,相當於建立了一個臨時資料,將a指向了一個臨時的空間
{
    cout << "func(const int &a)的呼叫" << endl;
}


int main()
{
    //int a = 10;
    //func(a);    //列印結果:func(int &a)的呼叫

    func(10);     //列印結果:func(const int &a)的呼叫

    system("pause");
    return 0;
}

    2、函式過載碰到函式預設引數

例項:

#include<iostream>
using namespace std;

//函式過載的注意事項

//2、函式過載碰到函式預設引數


void func2(int a, int b=10)
{
    cout << "func2(int a, int b)的呼叫" << endl;
}

void func2(int a)
{
    cout << "func2(int a)的呼叫" << endl;
}

int main()
{

    //func2(10);  //當函式過載碰到預設引數,出現二義性,報錯,儘量避免這種情況
    func2(10, 20);

    system("pause");
    return 0;
}