2010-03-18 35 views
26

在试图回答this问题,我发现代码int* p = new int[10]();编译罚款与VC9编译器和初始化的整数为0。所以,我的问题是:是新的int [10]()有效的C++吗?

  1. 首先是这个有效的C++或者是 它微软延期?
  2. 它是否保证初始化数组的元素的所有 ?
  3. 另外,如果我 做new int;new int();是否有任何区别? 后者保证初始化 的变量吗?

回答

29

首先是这个有效的C++或者是Microsoft扩展?

它是在C时有效++,标准的相关部分是5.3.4,用含有语法

是它保证初始化数组的所有元素第一段?

是的。款5.3.4/15指出

的新表达式创建类型T的对象初始化该对象如下:

...

  • 如果新的初始值设定为形式()的,该项目是值初始化(8.5)

其中用于POD初始化值意味着零初始化。

此外,有没有,如果我做新的INT任何区别;或新的int();?后者是否保证初始化变量?

是的,他们是不同的。根据上面的报价new int()将零初始化整数。在同一段的前一个块:

如果省略了新初始化:

  • 如果T是(可能CV修饰)非POD类类型(或其阵列) ,对象被默认初始化(8.5)。如果T是一个const限定类型,则底层类类型应该有一个用户声明的默认构造函数。

  • 否则,创建的对象具有不确定的值。如果T是一个常量限定类型,或(可能CV修饰)POD类类型(或其阵列)含有(直接或间接)const限定类型的一个成员,该程序是形成不良的;

所以new int不会初始化的内存。

0

如果我可以推测将会有点(我敢肯定,如果我错了,我会被纠正):

后者()也值初始化(因为它被称为在standardese),这使得在这种情况下整数的值为0。

这是对标准(C++ 03?)的一个相当新的补充,所以旧的编译器可能不支持它,并且保持它的独立性。

我记得当从MSVS 2003切换到2005(我认为)时,得到了很多警告w.r.t,编译器说“这个成员现在不会被初始化,现在不是这样”。

+0

尽管MSVS已经变得更符合每个版本的标准,但是没有像C++ 03标准那样的东西。 – Gorpik 2010-03-18 08:58:28

+3

@Gorpik,目前的标准是ISO/IEC 14882:2003,如果你在一年之前使用命名标准的通用规则,它将是C++ 03,即使这不是正确的名称(因为下一个标准将会肯定不会被称为C++ 11,即使大多数人会这样称呼它) – 2010-03-18 09:28:50

+0

对不起,你是对的。我忘记了2003年发布的标准修正案。 – Gorpik 2010-03-21 22:37:57

2

从标准。 “默认初始化T类型的对象意味着: - 如果T是非POD类类型 [类似于vector的情况],则调用T的默认构造函数。”

构造函数表示法T()用于表示类型T的默认值,对于内置类型和用户定义类型的默认构造方法,它是0。构造POD()产生值初始化并根据stdandard,其导致所有成员和子成员是默认构造的或零初始化的。

这就是为什么您的声明是合法的,但它是按照标准初始化为零;需要一些详细的查询恕我直言。

但是,我不能在标准寻找到它定义默认建设意义的内建类型

编辑: -

struct S { int x; }; 

void f() { 
    S s1;  // s1.x is uninitialized here 
    S s2 = S(); // s2.x is zero here 
} 

我认为,我们经常做我们自己的东西默认构造适用于内建类型指解释;因为C++标准没有定义它(至少我无法找到它)和i记得Stroustrup的约祖蒂斯说它是指被描述为值初始化T()为“零转换为T类型”为内置类型。

由于int*是一个内置类型,它被初始化为零。

但我真的不确定。

+1

这真的是一个初始化列表吗?我认为那些{1,2,3}? – Macke 2010-03-18 08:52:25

+0

@Abhay:§8.5与这个问题无关。正如Marcus Lindblom正确指出的那样,初始值设定项列表的形式为“{1,2,3}”,并且不能在新的表达式中使用(在当前标准中)。新表达式的初始化规则属于§5.3.4[expr.new] – 2010-03-18 09:12:34

+0

@dribeas:是的,编辑帖子,但是我在OP的分配数组来获取初始化部分的背景下冒险进入它。我的错误:-( – Abhay 2010-03-18 09:17:40

1
  1. 这是有效的C++根据段落5.3.4/1,这是很难在这里引用由于特殊格式。

  2. 根据5.3.4/15的产品值初始化,如果使用形式(),见第8.5但短答案是肯定的。

  3. 是的,在第一种情况下,变量不是价值初始化的,可以是任何东西,第二种情况下它的值初始化为零。