默认实参


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中有定义,因此是合法的。


展开阅读全文