- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的问题与 this 有点重叠。和其他几个类似的。这些有一些很好的答案,但我已经阅读了它们,但我仍然感到困惑,所以请不要认为这个问题是重复的。
所以,我有以下代码:
class A {
public: int _a;
}
void main()
{
A inst1;
A* inst2 = new A;
A* inst3 = new A();
}
_a
在 inst1
和 inst2
中未初始化,在 inst3< 中初始化为
。哪个初始化被称为哪个,为什么代码会这样工作?请考虑到我手头没有 C++ 03 标准,但我有最后的 C++ 11 草案(不过我正在按照 '03 标准编程),所以引用 '03 标准或引用 '11非常欢迎。0
/
P。 S. 这项研究的最初任务是正确地对任意模板类型 T
的成员进行 zeto 初始化。
最佳答案
没那么难:
A x;
A * p = new A;
这两个是默认初始化。由于您没有用户定义的构造函数,这仅意味着所有成员都是默认初始化的。默认初始化像 int
这样的基本类型意味着“没有初始化”。
下一步:
A * p = new A();
这是值初始化。 (我认为在 C++98/03 中不存在这个的自动版本,尽管在 C++11 中你可以说 A x{};
,而这个 brace-初始化 变成了值初始化。此外,A x = A();
尽管是 copy-initialization 或 A x( (A()))
尽管是直接初始化。)
同样,在您的情况下,这只是意味着所有成员都进行了值初始化。基本类型的值初始化意味着零初始化,这反过来意味着变量被初始化为零(所有基本类型都有)。
对于类类型的对象,默认初始化和值初始化都会调用默认构造函数。然后会发生什么取决于构造函数的初始化器列表,并且游戏会递归地为成员变量继续。
关于C++ 默认初始化和值初始化 : which is which, 在何时以及如何可靠地初始化模板类型成员时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8106016/
我是一名优秀的程序员,十分优秀!