C默认初始化和值初始化:哪个是哪个,什么时候和如何可靠地初始化一个模板类型的成员

我的问题与 this和其他几个类似的问题有些重叠.那些有一些很好的答案,但我已经阅读了,我仍然很困惑,所以请不要把这个问题看成一个重复的.

所以,我有以下代码

class A {
    public: int _a;
}

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

_a在inst1和inst2中未初始化,并在inst3中初始化为0.
哪个初始化被调用哪个,为什么代码的工作原理?请记入我的帐户,我手头没有C 03标准,但是我有最后一份C11草案(我以’03标准编程),所以’03标准或’11’的引用是最受欢迎的

P. S.本研究背后的原始任务是正确地对任意模板类型T的成员进行初始化.

解决方法

不是那么难
A x;
A * p = new A;

这两个是认初始化.由于您没有用户定义的构造函数,所以这意味着所有成员都被认初始化.认初始化基本类型,如int表示“无初始化”.

一个

A * p = new A();

这是值初始化. (我不认为在C 98/03中有一个自动版本,虽然在C 11中你可以说A x {},这个大括号初始化就成为初始化值,而A x = A() ;尽管是直接初始化,尽管是复制初始化,也是A x((A())).

再次,在你的情况下,这只是意味着所有的成员都被值初始化.基本类型的值初始化意味着零初始化,这又意味着变量初始化为零(所有基本类型都有).

对于类类型的对象,default-和value-initialization都调用认构造函数.然后发生的事情取决于构造函数的初始化器列表,而游戏会以递归方式继承成员变量.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...