默认参数值的位置是什么?只是在函数定义或声明中,还是两个地方都有?
当前回答
好问题…… 我发现编码器通常使用声明来声明默认值。我一直坚持一种方式(或警告)或其他太基于编译器
void testFunct(int nVal1, int nVal2=500);
void testFunct(int nVal1, int nVal2)
{
using namespace std;
cout << nVal1 << << nVal2 << endl;
}
其他回答
如果函数是公开的——非成员的、公共的或受保护的——那么调用者应该知道它们,并且默认值必须在头文件中。
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.
你可以任选其一,但不能两者兼得。通常在函数声明时这样做,然后所有调用者都可以使用该默认值。然而,你可以在函数定义中这样做,然后只有那些看到定义的人才能使用默认值。
声明通常是最有用的,但这取决于你想如何使用这个类。
两者都是无效的。
还有一点我没有发现任何人提到过:
如果你有虚方法,每个声明都可以有自己的默认值!
这取决于您调用的接口将使用哪个值。
ideone上的例子
struct iface
{
virtual void test(int a = 0) { std::cout << a; }
};
struct impl : public iface
{
virtual void test(int a = 5) override { std::cout << a; }
};
int main()
{
impl d;
d.test();
iface* a = &d;
a->test();
}
打印50个
我强烈建议您这样使用它
再加一分。带有默认参数的函数声明应该从右到左、从上到下进行排序。
例如,在下面的函数声明中,如果你改变了声明顺序,那么编译器会给你一个缺少默认参数的错误。编译器允许你在同一范围内将函数声明与默认参数分开,但它应该按照从右到左(默认参数)和从上到下(函数声明默认参数的顺序)的顺序进行。
//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;
}