C ++ 11现在支持在声明时设置类成员字段的值,如下所示:
class MyClass
{
private
int test = 0;
}
如果我也在构造函数中初始化变量,如下所示:
class MyClass
{
private
int test = 0;
public:
MyClass() : test(1)
{
}
}
这会导致变量的值设置两次,还是规范要求编译器优化它以仅初始化变量一次?如果规范没有规定任何内容,您是否知道着名编译器(例如MSVC,GCC等)的行为?
答案 0 :(得分:14)
标准实际上有一条规则,见§12.6.2/ 9:
如果给定的非静态数据成员同时具有大括号或等号初始化程序,则执行mem-initializer指定的初始化,并且非静态数据成员的大括号或等于-initializer 被忽略了。 [例子:给定
struct A { int i = /∗ some integer expression with side effects ∗/ ; A(int arg) : i(arg) { } // ... };
A(int)构造函数将简单地将i初始化为arg的值,并且副作用在i的大括号中 初始化程序不会发生。 - 结束例子]
因此,在您描述的情况下,如果调用默认构造函数,则仅执行在那里定义的初始化,test
将为1
。