默认参数值的位置是什么?只是在函数定义或声明中,还是两个地方都有?


当前回答

还有一点我没有发现任何人提到过:

如果你有虚方法,每个声明都可以有自己的默认值!

这取决于您调用的接口将使用哪个值。

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个

我强烈建议您这样使用它

其他回答

还有一点我没有发现任何人提到过:

如果你有虚方法,每个声明都可以有自己的默认值!

这取决于您调用的接口将使用哪个值。

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个

我强烈建议您这样使用它

你可以任选其一,但不能两者兼得。通常在函数声明时这样做,然后所有调用者都可以使用该默认值。然而,你可以在函数定义中这样做,然后只有那些看到定义的人才能使用默认值。

你可以使用任何一种(根据标准),但请记住,如果你的代码在包含default参数的定义之前看到了没有default参数的声明,那么编译错误就会出现。

例如,如果你包含头包含函数声明没有默认参数列表,因此编译器将寻找原型,因为它不知道你的默认参数值,因此原型将不匹配。

如果你把函数和默认参数放在定义中,那么包括这个文件,但我不建议这样做。

默认参数值必须出现在声明中,因为这是调用者看到的唯一内容。

编辑:正如其他人指出的那样,你可以在定义上有争论,但我建议在编写所有代码时都认为这不是真的。

如果函数是公开的——非成员的、公共的或受保护的——那么调用者应该知道它们,并且默认值必须在头文件中。

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.