默认初始化

时间:2013-03-17 19:22:09

标签: c++ c++11

#include <iostream>

using namespace std;
class Apple
{
    public:
       int i;
       string s = "HelloWorld";
       string s1;
       bool b;
};

int main(int argc, char *argv[]) {
    Apple a; //doesn't this trigger default initialization??
    cout << a.i << a.s << a.s1 << a.b;

}

如果对象是局部变量,则数据成员将被默认初始化。 但这是输出:0HelloWorld0。是不是这个值初始化??

2 个答案:

答案 0 :(得分:2)

  

这个值不是初始化吗?

在我的机器上,您的程序会输出-1219700747HelloWorld244,这是默认初始化的明确指示。

你得到的0HelloWorld0不是完全随机的,可能有很多原因。例如,它与您的操作系统架构有关。每个程序的所有新内存最初都归零,这就是为什么在这个简单的示例中,所有内容都设置为零。或者编译器出于性能原因静态初始化结构。

引用标准为12.6.2 / 8:

  

在非委托构造函数中,如果给定的非静态数据成员或基类未由a指定   mem-initializer-id(包括没有mem-initializer-list的情况,因为构造函数没有   ctor-initializer)并且实体不是抽象类的虚拟基类(10.4),然后是

     

- 如果实体是具有大括号或等于初始值的非静态数据成员,则实体初始化   如8.5中所述;

     

- 否则,如果实体是匿名联合或变体成员(9.5),则不执行初始化;

     

- 否则,实体默认初始化(8.5)。

答案 1 :(得分:2)

这是一个simple test,表示代码中没有执行值初始化。

#include <iostream>
#include <string>

using namespace std;
class Apple
{
    public:
       int i;
       string s = "HelloWorld";
       string s1;
       bool b;
};

int main() 
{
   {
     Apple a; 
     a.i = 42;
     a.b = true;
     cout << a.i << a.s << a.s1 << a.b;
   }
   {
     Apple a; 
     cout << a.i << a.s << a.s1 << a.b;
   }
   {
     Apple a{}; 
     cout << a.i << a.s << a.s1 << a.b;
   }
}

输出:

42HelloWorld142HelloWorld10HelloWorld0

如您所见,在第二种情况下,这些成员仍包含先前作业的值。请注意,我并不是说这是保证或标准定义的行为。

在第三种情况下,您指示应通过添加大括号来对对象进行值初始化。

如果您的编译器不支持C ++ 11的统一初始化语法,您可以将其更改为以下内容以达到相同的效果。

Apple a = Apple();