2013-11-09 104 views
7

C++ 11现在支持在声明时设定类成员字段的值,如下所示:C++ 11是否重新初始化初始化成员字段?

class MyClass 
{ 
private 
    int test = 0; 
} 

如果我还在构造这样初始化变量:

class MyClass 
{ 
private 
    int test = 0; 

public: 
    MyClass() : test(1) 
    { 
    } 
} 

将这会导致变量的值被设置两次,或者该规范指示编译器应该优化它以仅初始化变量一次?如果规范没有规定任何东西,你是否知道着名编译器(例如MSVC,GCC等)的行为?

回答

14

标准实际上具有用于此的规则,在§12.6.2/ 9:

如果一个给定的非静态数据成员既具有大括号或相等的初始值设定和MEM-初始化,执行由mem初始化程序指定的初始化,并且忽略非静态数据成员的括号或等于初始化程序 。 [实施例:鉴于

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

的A(int)构造将简单地初始化i至arg的值,和副作用在我的大括号或-equal- 初始化将不会发生。 - 结束示例]

所以在你所描述的情况,如果默认构造函数被调用,只定义了初始化会有执行,test1