2017-04-12 96 views
0

这里的变量是1或2,这个编译器或标准是相关的吗?C++默认参数构造函数vs内联初始化优先级

class foo { 
    int val = 1; 

    foo(int bar = 2) : val(bar) {} 
} 
+0

如果你没有传递任何东西给构造函数,它会变成2。 – George

+0

这是2.在这种情况下'= 1'是多余的。 val'等于1的唯一方法是,如果那是显式传递给构造函数的值。 – Michael

+0

这个使用初始化列表的事实是偶然的。就像你写了'{foo = bar; }'。此外,您正在使用C++ 11的事实在这里不是一个相关的问题。 – Michael

回答

1

它是2除非您在调用构造函数时提供了不同的值。 见cpp reference关于非静态数据成员初始化:

如果一个成员都有一个默认的成员初始化,并在 成员初始化列表出现在构造函数中,默认成员 初始化将被忽略。

1

这个位置:foo(int bar = 2)被称为默认参数,

,并允许你调用一个函数没有提供这样的说法。

怎么样?

如果你这样做:

foo(100)然后VAL被初始化为100

,但如果你ommit参数

foo()然后VAL与2

在初始化最后,这个声明使得这个init成为多余的:

int val = 1;