預設引數


C++ 可以使用預設引數,要在一開始的函式原型宣告中定義預設引數,函式實作時無需再定義,來看個實際例子:

#include <iostream> 
using namespace std; 

double area(double, double pi = 3.14159); 

int main() { 
    double r, pi; 

    cout << "輸入半徑與 PI: "; 
    cin >> r >> pi; 

    cout << "面積(自訂 PI):" << area(r, pi) << endl
         << "面積(default):" << area(r) << endl;

    return 0; 
} 

double area(double r, double pi) { 
    return r*r*pi; 
}

執行結果:

輸入半徑與 PI: 25 3.14
面積(自訂 PI):1962.5
面積(default):1963.49

在上面的程式中,area 函式將參數 pi 預設值設為 3.14159,在不指定第二個引數時,area 將使用預設引數,如果指定 pi 的話,就以使用者的指定。

可以指定兩個以上的預設引數,然而預設引數一旦出現在參數列,右邊的參數也必須設定預設引數,在使用預設引數時,必須注意配置順序,例如下面的宣告是錯誤的:

double volumn(double h = 1.0, double w = 1.0, double len);

必須是以下才是正確的:

double volumn(double len, double w = 1.0, double h = 1.0);

如果函式有兩個以上的預設引數,在程式呼叫時必須注意,因為預設引數是以引數的順序由左至右來進行的,例如若有個函式宣告如下:

bool setScreen(int width = 80, int height = 24, char bkcolor = ' ');

在呼叫函式時,若使用 setScreen('R'),相當於 setScreen('R', 24, ' ') 而不是 setScreen(80, 24, 'R'),而呼叫時使用 setScreen(, , 'R') 這個方法是錯誤的。

定義函式原型時,允許多次定義預設引數,例如:

#include <iostream> 
using namespace std; 

void f(int n, int k = 1);
void f(int n = 0, int k); 

int main() { 
    f();

    return 0; 
} 

void f(int n, int k) {
    cout << n << endl;
    cout << k << endl;
}

以上可以通過編譯並執行,第二次定義 f 原型時,雖然 k 沒有定義預設引數,然而前一個 f 中有定義,因此是合法的。