C++默认初始化和值初始化:哪个是哪个,何时调用哪个以及如何可靠地初始化模板类型成员

问题描述 投票:0回答:2

我的问题与this和其他几个类似的问题有些重叠。这些有一些很好的答案,但我已经阅读了它们,但我仍然很困惑,所以请不要认为这个问题是重复的。

所以,我有以下代码:

class A {
    public: int _a;
}

void main()
{
    A inst1;
    A* inst2 = new A;
    A* inst3 = new A();
}

_a
inst1
inst2
中未初始化,并在
0
中初始化为
inst3
。 哪个初始化被调用,为什么代码会这样工作?请考虑到我手头没有 C++ 03 标准,但我有最新的 C++ 11 草案(不过,我是按照 '03 标准进行编程的),因此对 '03 标准的引用或对 '11 的引用是非常欢迎。

P。 S. 这项研究背后的最初任务是正确地对任意模板类型的成员进行零初始化

T

c++ initialization default-value
2个回答
49
投票

没那么难:

A x;
A * p = new A;

这两个是默认初始化。由于您没有用户定义的构造函数,这仅意味着所有成员都是默认初始化的。默认初始化像

int
这样的基本类型意味着“不初始化”。

下一个:

A * p = new A();

这是值初始化。 (我认为 C++98/03 中不存在自动版本,尽管在 C++11 中你可以说

A x{};
,并且这个 brace-initialization 变成了值初始化。此外,
A x = A(); 
实际上已经足够接近了,尽管是 复制初始化,或者
A x((A()))
,尽管是 直接初始化。)

同样,在您的情况下,这仅意味着所有成员都已值初始化。基本类型的值初始化意味着零初始化,这又意味着变量被初始化为零(所有基本类型都有)。

对于类类型的对象,默认初始化和值初始化都会调用默认构造函数。然后会发生什么取决于默认构造函数是编译器定义的还是用户定义的。如果是用户定义的,则默认初始化和值初始化的行为方式相同,并且发生的情况取决于构造函数的初始值设定项列表,并且成员变量的游戏会递归地继续。如果编译器已定义,则默认值和值初始化将按预期运行。


1
投票

是的,

A inst4 ();
被视为函数声明。
std::string str();
应该是相同的(即我认为你错误地认为它有效)。

显然(从这里开始),C++03 的

inst3._a
将为 0,但 C++98 会将其保留为未初始化。

© www.soinside.com 2019 - 2024. All rights reserved.