C ++中的默认参数

默认参数是在函数定义中传递的参数,如果没有提供参数,则在函数调用时,编译器将使用该参数。

下面是默认参数的示例:

#include <bits/stdc++.h>
using namespace std;

void print(int a, int b = 1, int c = 2, int d = 3)
{
    cout << "//a: " << a << endl;
    cout << "//b:" << b << endl;
    cout << "//c:" << c << endl;
    cout << "//d:" << d << endl;
}

int main(){
    int a = 12, b = 13, c = 14, d = 15;
 
    //第一个函数调用
    cout << "only argument a passed\n";
    print(a);
 
    //第二个函数调用
    cout << "only arguments a,b passed\n";
    print(a, b);
 
    //第三函数调用
    cout << "only arguments a,b,c passed\n";
    print(a, b, c);
 
    //第四函数调用
    cout << "All arguments a,b,c,d passed\n";
    print(a, b, c, d);

    return 0;
}

输出:

only argument a passed
//a: 12
//b: 1
//c: 2
//d: 3
only arguments a,b passed
//a: 12
//b: 13
//c: 2
//d: 3
only arguments a,b,c passed
//a: 12
//b: 13
//c: 14
//d: 3
All arguments a,b,c,d passed
//a: 12
//b: 13
//c: 14
//d: 15

在上面的示例中,我们使用了默认参数concept。这是运算符重载的一个实例,其中解析是在编译时完成的。

因此,在第一个函数调用的情况下,我们仅在调用函数中传递了一个参数a,而其他参数bcd为其默认值。

在第二个函数调用的情况下,我们仅在调用函数中传递了两个参数ab,而其他参数cd则采用了其默认值。

在第三个函数调用的情况下,我们在调用函数中传递了三个参数abc,而另一个参数d为其默认值。

在第四个函数调用的情况下,我们在调用函数中传递了所有四个参数,因此不采用默认参数值

但是在定义默认参数的情况,我们需要遵循一些规则,以便编译器不会发现函数重载是模棱两可的。

1)在函数定义中,如果我们声明一个变量的默认参数,则此后的所有变量都需要具有默认参数

如下所示,它不是使用默认参数的有效函数定义,并且会引发编译错误,

int func(int a, int b=0, int c)
//这将引发错误,因为b已分配默认参数 
//值,但c尚未出现,尽管c在b之后。

//应该这样声明:
int func(int a, int c ,int b=0)

2)如果在调用函数时提供了参数值,则将复制参数的默认值

3)不应导致歧义,否则会导致编译错误。