首页 > 编程笔记

C++函数的默认参数详解

和 C 语言相比,C++ 允许为函数的参数设置默认值,这样做的好处是,调用函数时不必总是提供所有的参数,大大提高了函数的灵活性。

为函数指定默认实参的方法类似于初始化一个变量,例如:
//带默认参数的函数
void func(int n, float b = 1.2, char c = '@');
在上述 func() 函数的声明中,参数 n 是一个普通的参数,而参数 b 和 c 是具有默认实参的参数。

指定了默认参数后,调用函数时就可以省略对应的实参了,例如调用声明的 func():
func(5); // 参数 n 的值为 5,b 的值为 1.2,c 的值为'@'
func(5, 3); // 参数 n 的值为 5,b 的值为 3,c 的值为 '@'
func(5, 3, 'm'); // 参数 n 的值为 5,b 的值为 3,c 的值为 'm'
C++ 规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值,那么它后面的所有形参都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。

例如,下面声明 func() 函数的写法是错误的:
void func(int n, float b = 1.2, char c);
void func(int n = 0, float b, char c = '@');

指定默认参数的位置

默认参数可以在函数的声明处指定,也可以在函数的定义处指定。C++ 规定,一个参数只能在一个文件中被指定一次默认实参,但可以在多次声明中依次向前指定默认参数。

举个简单的例子:
#include <iostream>

void func(int a, int b = 10, int c = 36);

int main() {
    func(99);
    return 0;
}

void func(int a, int b = 10, int c = 36) {
    std::cout << a << ", " << b << ", " << c << std::endl;
}
这段代码在编译时会报错,错误信息表明不能在函数定义和函数声明中同时指定默认参数。

修改上面的程序:
#include <iostream>

void func(int a, int b, int c = 36);
void func(int a, int b = 10, int c);
int main() {
    func(99);
    return 0;
}

void func(int a, int b, int c) {
    std::cout << a << ", " << b << ", " << c << std::endl;
}
这种声明方式是正确的。第一次声明时为 c 指定了默认值,第二次声明时为 b 指定了默认值;第二次声明是添加默认参数。需要提醒的是,第二次声明时不能再次给 c 指定默认参数,否则就是重复声明同一个默认参数。

推荐阅读