这里的变量是1或2,这个编译器或标准是相关的吗?C++默认参数构造函数vs内联初始化优先级
class foo {
int val = 1;
foo(int bar = 2) : val(bar) {}
}
这里的变量是1或2,这个编译器或标准是相关的吗?C++默认参数构造函数vs内联初始化优先级
class foo {
int val = 1;
foo(int bar = 2) : val(bar) {}
}
它是2
除非您在调用构造函数时提供了不同的值。 见cpp reference关于非静态数据成员初始化:
如果一个成员都有一个默认的成员初始化,并在 成员初始化列表出现在构造函数中,默认成员 初始化将被忽略。
这个位置:foo(int bar = 2)
被称为默认参数,
,并允许你调用一个函数没有提供这样的说法。
怎么样?
如果你这样做:
foo(100)
然后VAL被初始化为100
,但如果你ommit参数
foo()
然后VAL与2
在初始化最后,这个声明使得这个init成为多余的:
int val = 1;
如果你没有传递任何东西给构造函数,它会变成2。 – George
这是2.在这种情况下'= 1'是多余的。 val'等于1的唯一方法是,如果那是显式传递给构造函数的值。 – Michael
这个使用初始化列表的事实是偶然的。就像你写了'{foo = bar; }'。此外,您正在使用C++ 11的事实在这里不是一个相关的问题。 – Michael