函数参数的默认值

1。

int Add (int a, int b = 3); int Add (int a, int b) { } 

2。

 int Add (int a, int b); int Add (int a, int b = 3) { } 

这两个工作,这是标准的方式, 为什么

如果将声明放在一个头文件中,并将定义放在单独的.cpp文件中,并且#include来自不同的.cpp文件的头文件,您将能够看到差异。

具体来说,假设:

lib.h

 int Add(int a, int b); 

lib.cpp

 int Add(int a, int b = 3) { ... } 

TEST.CPP

 #include "lib.h" int main() { Add(4); } 

test.cpp的编译将不会看到默认的参数声明,并会失败并出现错误。

出于这个原因,默认参数定义通常在函数声明中指定:

lib.h

 int Add(int a, int b = 3); 

在C ++中,对于在参数列表中的位置的默认参数施加的要求如下:

  1. 给定参数的默认参数不得超过一次。 多次指定(即使使用相同的默认值)也是非法的。

  2. 具有默认参数的参数必须在参数列表的末尾形成一个连续的组。

现在,牢记这一点,在C ++中,只要上述要求不断得到满足,就可以让一组参数具有从一个函数声明到另一个声明的默认参数。

例如,你可以声明一个没有默认参数的函数

 void foo(int a, int b); 

为了在声明后调用这个函数,你必须明确地指定两个参数。

在同一个翻译单元的后面(进一步向下),你可以重新声明它,但这次有一个默认的参数

 void foo(int a, int b = 5); 

从这一点上,你可以用一个明确的论点来调用它。

再下来,你可以重新声明它再次添加一个默认参数

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

从这一点上,你可以没有明确的论点来调用它。

完整的例子可能如下所示

 void foo(int a, int b); int main() { foo(2, 3); void foo(int a, int b = 5); // redeclare foo(8); // OK, calls `foo(8, 5)` void foo(int a = 1, int b); // redeclare again foo(); // OK, calls `foo(1, 5)` } void foo(int a, int b) { // ... } 

至于你的问题中的代码,这两个变种是完全有效的,但他们意味着不同的事情。 第一个变体立即为第二个参数声明一个默认参数。 第二个变体最初声明你的函数没有默认参数,然后为第二个参数添加一个。

这两个声明(即第二个声明后面的代码所看到的方式)的净效果完全相同:函数对其第二个参数具有默认参数。 但是,如果您设法在第一个和第二个声明之间挤压一些代码,这两个变体的行为将有所不同。 在第二个变体中,函数在声明之间没有默认参数,所以你必须显式地指定两个参数。

默认参数必须在函数名的第一个出现处指定 – 通常在函数原型中。 如果函数原型被省略,因为函数定义也作为原型,那么应该在函数头中指定默认参数。

第一种方式比第二种更受欢迎。

这是因为头文件会显示参数是可选的,它的默认值是什么。 此外,这将确保默认值将是相同的,不pipe相应的.cpp文件的实现。

第二种方法是不保证第二个参数的默认值。 默认值可能会改变,取决于如何实现相应的.cpp文件。