4

C++ 标准说(8.5/5):

默认初始化类型的对象T意味着:

  • 如果T是非 POD 类类型(第 9 条),则调用 的默认构造函数(如果没有可访问的默认构造函数T,则初始化格式错误)。T

  • 如果T是数组类型,则每个元素都是默认初始化的。

  • 否则,对象被零初始化。

使用此代码

struct Int { int i; };

int main()
{
    Int a;
}

该对象a是默认初始化的,但显然a.i不一定等于 0 。这不与标准相矛盾吗,就像IntPOD 一样,不是数组?

编辑 从 更改为classstruct所以这Int是一个 POD。

4

3 回答 3

6

从 2003 标准的 8.5.9 开始:

如果没有为对象指定初始化程序,并且该对象是(可能是 cv 限定的)非 POD 类类型(或其数组),则该对象应默认初始化;如果对象是 const 限定类型,则基础类类型应具有用户声明的默认构造函数。否则,如果没有为非静态对象指定初始化器,则该对象及其子对象(如果有)具有不确定的初始值);如果对象或其任何子对象是 const 限定类型,则该程序是非良构的。

您显示的类是 POD,因此突出显示的部分适用,并且您的对象根本不会被初始化(因此您引用的第 8.5/5 节根本不适用)。

编辑:根据您的评论,此处引用当前标准最终工作草案的第 8.5/5 节(我没有真正的标准,但 FDIS 应该非常接近):

默认初始化 T 类型的对象意味着:

— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

— 如果 T 是数组类型,则每个元素都是默认初始化的;

否则,不执行初始化。

于 2011-11-24T11:35:06.893 回答
1

您的变量未初始化。采用

Int a = Int();

初始化您的 POD 或声明一个标准构造函数以使其成为非 POD;但是您也可以出于性能原因使用未初始化的 POD,例如:

Int a;
a.i = 5;
于 2011-11-24T12:25:06.477 回答
0

不,该对象a不是默认初始化的。如果你想默认初始化它,你必须说:

Int a = Int() ;
于 2011-11-24T11:37:09.513 回答