C++规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值,那么它后面的所有形参都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。

声明是用户可以看到的部分,客户非常信任地使用这个特性,希望得到一定的结果,但是你在实现里使用了不同的缺省值,那么将是灾难性的。因此编译器禁止声明和定义时同时定义缺省参数值。

类的成员函数的参数表在声明时默认参数位于参数表右部,如 int fn(int a, int b=0, int c=5)之类的,但在它定义的时候则不能加默认参数,只能写 int fn(int a,int b,int c);

若声明时没有定义缺省参数值,那么在定义成员函数时可以定义缺省参数值。但这种情况通常用户是看不见的,因此应避免。

对于非类中的函数,在函数声明中定义默认参数的另外一个好处是,可以利用声明来随意更改默认参数的值。

多个声明与默认参数

在C++中,一个函数可以有多个声明。当一个函数有多个声明时:

  • 不同声明之间的默认参数是能组合的。
  • 不能有对于同一个形参重复的默认参数声明,即使是同一个值也不行。 ```cpp void multi(int a1, int a2, int a3) { std::cout << a1 << a2 << a3 << ‘\n’; }

// 可行 void multi(int a1,int a2, int a3 = 3);

void multi(int a1, int a2 = 2, int a3);

void multi(int a1 = 1, int a2, int a3);

  1. ```cpp
  2. // 不可行,因为有俩个申明同时对 a2 赋了默认值
  3. int foo(int,int);
  4. int foo(int a1, int a2 = 0);
  5. int foo(int a1, int a2 = 0);