Default value of function parameter

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)
{


}

Both work; which is the standard way and why?

115046 次浏览

如果您将声明放在一个头文件中,将定义放在一个单独的 .cpp文件中,将 #include放在另一个 .cpp文件的头中,您将能够看到其中的差异。

具体来说,假设:

Libh

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的编译将不会看到默认的参数声明,并且将失败并出现错误。

因此,默认参数定义通常在函数 声明中指定:

Libh

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

默认参数必须在函数名的第一个匹配项中指定ーー通常是在函数原型中。如果由于函数定义也作为原型而省略了函数原型,那么应该在函数头中指定默认参数。

第一种方法比第二种更可取。

这是因为头文件将显示参数是可选的,以及它的默认值是什么。此外,这将确保默认值是相同的,无论对应的。Cpp 文件。

第二种方法是不保证第二个参数的默认值。默认值可以更改,具体取决于对应的。实现 cpp 文件。

在 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)
{
// ...
}

至于你问题中的代码,两个变量都是完全有效的,但它们的意思不同。第一个变量立即为第二个参数声明一个默认参数。第二个变量最初在没有默认参数的情况下声明函数,然后为第二个参数添加一个参数。

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

这里需要记住的是,默认参数必须是函数定义中的最后一个参数。

无法编译以下代码:

void fun(int first, int second = 10, int third);

将编译以下代码:

void fun(int first, int second, int third = 10);