#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
。是不是这个值初始化??
答案 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();