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

时间:2011-05-28 15:03:29

标签: c++ class constructor default-value

我正在尝试使用默认值创建构造函数。复杂性来自于为类使用单独的头文件和代码文件。我有一个包含以下内容的头文件:

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 个答案:

答案 0 :(得分:13)

默认只能放在头文件中。根据我的经验,在构造函数(或其他函数)中使用默认值很少是一个好主意 - 它通常会在某个地方出现问题。不是说我自己的代码中没有一些!

答案 1 :(得分:8)

不要在定义中提供默认值:

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

现在是正确的。默认值应仅在声明中提供,您已在头文件中完成。

顺便说一句,更喜欢使用成员初始化列表而不是分配:


当然,如果它的声明兼定义,那么你必须在声明兼定义中提供默认值(如果你想要的话):

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

答案 2 :(得分:4)

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


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

例如:

foo(bool debug = false);

//...

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

答案 3 :(得分:2)

在C ++中(我不知道其他语言),默认参数只是函数声明&的一部分。不是功能定义。

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

很好,将你的定义改为:

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

答案 4 :(得分:1)

它不需要成员函数定义中的默认参数

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