C++构造函数默认值头文件

9

我正在尝试创建一个带有默认值的构造函数。问题在于使用了分离的类头文件和代码文件。我有一个包含以下内容的头文件:

class foo {
    bool dbg;
    public:
        foo(bool debug = false);
}

包含以下代码文件:

foo::foo(bool debug = false) {
    dbg = debug;
}

当我尝试使用g++进行编译(即g++ -c foo.cc),它会报错:
foo.cc:373:65: error: default argument given for parameter 1 of ‘foo::foo(bool)’
foo.h:66:4: error: after previous specification in ‘foo::foo(bool)’

我做错了什么?
5个回答

13

默认值只能放在头文件中。根据我的经验,在构造函数(或其他函数)中使用默认值通常不是一个好主意 - 这通常意味着某处存在不完美的解决方案。并不是说我的代码里没有一些这样的例子!


谢谢。它有效 :). 正如您从我的示例中所看到的,我这样做是为了在必要时提供一些调试信息。如果没有通过构造函数中的默认值实现,是否有推荐的实现方式? - Clivest
与构造函数链接相反?特别是当有许多需要初始化的成员时?在我的看法中,这是使用构造函数默认参数值的一个实用优点。 - ybakos

8
不要在 定义 中提供默认值:
foo::foo(bool debug) {
    dbg = debug;
}

现在是正确的。默认值应该只在声明中提供,你已经在头文件中做到了。
顺便说一下,最好使用成员初始化列表而不是赋值:

当然,如果它是声明兼定义,则必须在声明兼定义中提供默认值(如果需要):

class foo {
    bool dbg;
    public:
        foo(bool debug = false) : dbg(debug) {}
                               //^^^^^^^^^^^ using member initialization list
}

4

当函数的声明和定义分开时,默认值必须只在函数的声明中出现。


如果您愿意,可以将默认值作为注释添加,但是请注意,更改默认值并忘记更改注释可能会导致一些误导(:

例如:

foo(bool debug = false);

//...

foo::foo(bool debug /* = false */ )
{ /* ... */ }

2
在C++(我不知道其他语言),默认参数仅是函数声明的一部分,而不是函数定义。
class foo {
    bool dbg;
    public:
        foo(bool debug = false);
}

没问题,将您的定义更改为:

foo::foo(bool debug) {
    dbg = debug;
}

1

在成员函数定义中不需要默认参数,

foo::foo(bool debug) {
    dbg = debug;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接