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)
{
}
这两种方法都可以工作;这是标准方式,也是的原因
发布于 2010-05-16 15:38:32
如果您将声明放在头文件中,将定义放在单独的.cpp
文件中,然后从不同的.cpp
文件中#include
头文件,您将能够看到区别。
具体来说,假设:
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);
发布于 2010-05-16 15:49:21
在C++中,关于默认参数在参数列表中的位置,对默认参数的要求如下:
给定参数的
现在,记住这一点,在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)
{
// ...
}
至于你问题中的代码,这两种变体都是完全有效的,但它们的含义不同。第一个变体立即为第二个参数声明了一个默认参数。第二个变种最初声明函数时没有默认参数,然后为第二个参数添加一个参数。
这两个声明的最终效果(即第二个声明后面的代码所看到的方式)是完全相同的:函数的第二个参数有默认参数。但是,如果您设法在第一个和第二个声明之间压缩一些代码,这两个变体的行为将有所不同。在第二个变体中,函数的声明之间没有默认参数,因此您必须显式指定这两个参数。
发布于 2010-05-16 15:43:43
第一种方式比第二种方式更可取。
这是因为头文件将显示该参数是可选的,以及它的默认值。此外,这将确保无论相应.cpp文件的实现是什么,缺省值都是相同的。
在第二种方法中,不能保证第二个参数的默认值。默认值可能会更改,具体取决于相应.cpp文件的实现方式。
https://stackoverflow.com/questions/2842928
复制相似问题