目录

1 函数参数默认值是什么

2 参数默认值的定义顺序



1 函数参数默认值是什么

        在 C++ 中,函数的参数默认值是指在函数定义时,为参数指定一个默认值,当调用该函数时,如果没有给参数传递值,则会使用该参数的默认值。

        C++ 中定义具有默认参数的函数的语法如下:

return_type function_name(type parameter_name = default_value);

        其中,parameter_name 表示函数的参数名,default_value 表示参数的默认值。需要注意的是,如果在函数声明中为参数指定了默认值,在函数定义中就不需要再次指定。

        下面代码定义了一个带有默认参数的函数:

#include <iostream>
using namespace std;

// 带有默认参数的函数
void print(int n, char c = '*') {
    for (int i = 0; i < n; i++) {
        cout << c;
    }
    cout << endl;
}

int main() {
    // 调用 print() 函数时不传递第二个参数,使用默认值
    print(5); // 输出:*****

    // 调用 print() 函数时传递第二个参数,使用传递的值
    print(3, '-'); // 输出:---
    
    return 0;
}

2 参数默认值的定义顺序

        在 C++ 中,定义函数参数默认值的顺序是从左往右的,也就是说,如果一个函数有多个参数都有默认值,那么默认值的定义应该从右往左依次出现。

例如:

#include <iostream>
using namespace std;

// 带有多个默认参数的函数
void print(char c = '*', int n = 5) {
    for (int i = 0; i < n; i++) {
        cout << c;
    }
    cout << endl;
}

int main() {
    // 调用 print() 函数时不传递参数,使用默认值
    print(); // 输出:*****

    // 调用 print() 函数时传递部分参数,使用默认值
    print('-'); // 输出:-----

    // 调用 print() 函数时传递全部参数,使用传递的值
    print('@', 3); // 输出:@@@
    
    return 0;
}

        在上面的代码中,函数 print() 具有两个参数,分别是 c 和 n。它们的默认值分别是 '*' 和 5。由于默认参数的定义顺序是从右往左的,所以在函数定义中,先定义了参数 n 的默认值,再定义了参数 c 的默认值。

        需要注意的是,在 C++ 中,如果为函数的某个参数指定了默认值,那么在该参数的右边的所有参数都必须有默认值,否则就会出现二义性错误。例如,下面的代码就是错误的:

void foo(int x, int y = 0, int z) {
    // ...
}

        在上面的代码中,参数 y 有默认值,但参数 z 没有默认值,这会导致编译器无法确定应该传递哪个参数。

        出现二义性错误的原因是因为在C++中,函数调用时,如果省略某些参数,则编译器会按照参数的位置进行匹配,但是如果出现参数缺失的情况,编译器无法确定这个参数是应该被赋予默认值还是作为后续的参数传递,从而导致二义性错误。

        举个例子,假设有如下函数定义:

void foo(int a, int b = 1, int c = 2);

        当调用该函数时,可以使用以下两种方法:

foo(10, 20);  // a=10, b=20, c=2
foo(10);      // a=10, b=1,  c=2

        在第二种调用方式中,省略了参数 b 和 c,此时编译器会自动使用参数的默认值,即 b=1 和 c=2。

        然而,如果出现以下调用方式:

foo(10, , 30);  // 编译错误:二义性

        这里省略了参数 b,并且给参数 c 赋值了 30,但是对于缺失的参数 b,编译器无法确定它应该被赋予默认值还是作为后续的参数传递,从而导致了二义性错误。

        因此,为了避免出现二义性错误,如果为函数的某个参数指定了默认值,那么在该参数的右边的所有参数都必须有默认值,或者在调用函数时显式指定所有参数的值。