首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >函数参数的默认值

函数参数的默认值
EN

Stack Overflow用户
提问于 2010-05-16 15:31:49
回答 5查看 113.5K关注 0票数 142

1.

代码语言:javascript
复制
int Add (int a, int b = 3);
int Add (int a, int b)
{

}

2.

代码语言:javascript
复制
int Add (int a, int b);
int Add (int a, int b = 3)
{

}

这两种方法都可以工作;这是标准方式,也是的原因

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-16 15:38:32

如果您将声明放在头文件中,将定义放在单独的.cpp文件中,然后从不同的.cpp文件中#include头文件,您将能够看到区别。

具体来说,假设:

lib.h

代码语言:javascript
复制
int Add(int a, int b);

lib.cpp

代码语言:javascript
复制
int Add(int a, int b = 3) {
   ...
}

test.cpp

代码语言:javascript
复制
#include "lib.h"

int main() {
    Add(4);
}

test.cpp的编译将看不到默认的参数声明,并且将失败并返回错误。

因此,通常在函数声明中指定缺省参数定义

lib.h

代码语言:javascript
复制
int Add(int a, int b = 3);
票数 213
EN

Stack Overflow用户

发布于 2010-05-16 15:49:21

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

给定参数的

  1. 默认参数只能指定一次。多次指定它(即使使用相同的默认值)是illegal.
  2. Parameters,默认参数必须在参数列表的末尾形成一个连续的组。

现在,记住这一点,在C++中,只要不断满足上述要求,您就可以从函数的一个声明到下一个声明“增长”具有默认参数的参数集。

例如,您可以声明一个没有缺省参数的函数

代码语言:javascript
复制
void foo(int a, int b);

为了在这样的声明之后调用该函数,您必须显式地指定这两个参数。

稍后(再往下)在相同的翻译单元中,您可以再次重新声明它,但这次使用一个默认参数

代码语言:javascript
复制
void foo(int a, int b = 5);

从现在开始,你可以只用一个显式的参数来调用它。

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

代码语言:javascript
复制
void foo(int a = 1, int b);

从这一点开始,你可以不用显式的参数来调用它。

完整的示例可能如下所示

代码语言:javascript
复制
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)
{
  // ...
}

至于你问题中的代码,这两种变体都是完全有效的,但它们的含义不同。第一个变体立即为第二个参数声明了一个默认参数。第二个变种最初声明函数时没有默认参数,然后为第二个参数添加一个参数。

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

票数 45
EN

Stack Overflow用户

发布于 2010-05-16 15:43:43

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

这是因为头文件将显示该参数是可选的,以及它的默认值。此外,这将确保无论相应.cpp文件的实现是什么,缺省值都是相同的。

在第二种方法中,不能保证第二个参数的默认值。默认值可能会更改,具体取决于相应.cpp文件的实现方式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2842928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档