0
#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. 这不是值初始化吗??

4

2 回答 2

2

这不是值初始化吗??

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

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

引用 12.6.2/8 的标准:

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

— 如果实体是具有大括号或等号初始化器的非静态数据成员,则实体按照 8.5 中的规定进行初始化;

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

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

于 2013-03-17T19:27:32.330 回答
2

这是一个简单的测试,表明您的代码中没有执行任何值初始化。

#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();
于 2013-03-17T19:31:37.457 回答