默认参数值的位置是什么?只是在函数定义或声明中,还是两个地方都有?
当前回答
你可以使用任何一种(根据标准),但请记住,如果你的代码在包含default参数的定义之前看到了没有default参数的声明,那么编译错误就会出现。
例如,如果你包含头包含函数声明没有默认参数列表,因此编译器将寻找原型,因为它不知道你的默认参数值,因此原型将不匹配。
如果你把函数和默认参数放在定义中,那么包括这个文件,但我不建议这样做。
其他回答
c++将默认参数逻辑放在调用端,这意味着如果不能从调用端计算默认值表达式,则不能使用默认值。
其他编译单元通常只包含声明,因此放置在定义中的默认值表达式只能在定义编译单元本身中使用(并且在定义之后,即在编译器看到默认值表达式之后)。
最有用的地方是在声明(.h)中,这样所有用户都能看到它。
有些人也喜欢在实现中添加默认值表达式(作为注释):
void foo(int x = 42,
int y = 21);
void foo(int x /* = 42 */,
int y /* = 21 */)
{
...
}
然而,这意味着重复,并将增加注释与代码不同步的可能性(没有注释的代码会更糟糕吗?带有误导性注释的代码!)。
如果函数是公开的——非成员的、公共的或受保护的——那么调用者应该知道它们,并且默认值必须在头文件中。
If the functions are private and out-of-line, then it does make sense to put the defaults in the implementation file because that allows changes that don't trigger client recompilation (a sometimes serious issue for low-level libraries shared in enterprise scale development). That said, it is definitely potentially confusing, and there is documentation value in presenting the API in a more intuitive way in the header, so pick your compromise - though consistency's the main thing when there's no compelling reason either way.
再加一分。带有默认参数的函数声明应该从右到左、从上到下进行排序。
例如,在下面的函数声明中,如果你改变了声明顺序,那么编译器会给你一个缺少默认参数的错误。编译器允许你在同一范围内将函数声明与默认参数分开,但它应该按照从右到左(默认参数)和从上到下(函数声明默认参数的顺序)的顺序进行。
//declaration
void function(char const *msg, bool three, bool two, bool one = false);
void function(char const *msg, bool three = true, bool two, bool one); // Error
void function(char const *msg, bool three, bool two = true, bool one); // OK
//void function(char const *msg, bool three = true, bool two, bool one); // OK
int main() {
function("Using only one Default Argument", false, true);
function("Using Two Default Arguments", false);
function("Using Three Default Arguments");
return 0;
}
//definition
void function(char const *msg, bool three, bool two, bool one ) {
std::cout<<msg<<" "<<three<<" "<<two<<" "<<one<<std::endl;
}
声明通常是最有用的,但这取决于你想如何使用这个类。
两者都是无效的。
默认参数值必须出现在声明中,因为这是调用者看到的唯一内容。
编辑:正如其他人指出的那样,你可以在定义上有争论,但我建议在编写所有代码时都认为这不是真的。
推荐文章
- 为什么我的程序不能在Windows 7下用法语编译?
- 如何获取变量的类型?
- 什么是奇怪的重复模板模式(CRTP)?
- 连接两个向量的最佳方法是什么?
- 在c++中,是通过值传递更好,还是通过引用到const传递更好?
- 在STL中deque到底是什么?
- Windows上最好的免费c++分析器是什么?
- 如何自动转换强类型枚举为int?
- 在一个类中使用具有成员函数的泛型std::function对象
- 'for'循环中的后增量和前增量产生相同的输出
- 虚函数和纯虚函数的区别
- c++中的_tmain()和main()有什么区别?
- 内存泄漏是否正常?
- 当启用c++ 11时,std::vector性能回归
- 什么时候使用哪种指针?