默认参数是在函数定义中传递的参数,如果没有提供参数,则在函数调用时,编译器将使用该参数。
下面是默认参数的示例:
#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,而其他参数b,c,d为其默认值。
在第二个函数调用的情况下,我们仅在调用函数中传递了两个参数a,b,而其他参数c,d则采用了其默认值。
在第三个函数调用的情况下,我们在调用函数中传递了三个参数a,b,c,而另一个参数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)不应导致歧义,否则会导致编译错误。