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