在试图回答this问题,我发现代码int* p = new int[10]();
编译罚款与VC9编译器和初始化的整数为0。所以,我的问题是:是新的int [10]()有效的C++吗?
- 首先是这个有效的C++或者是 它微软延期?
- 它是否保证初始化数组的元素的所有 ?
- 另外,如果我 做
new int;
或new int();
是否有任何区别? 后者保证初始化 的变量吗?
在试图回答this问题,我发现代码int* p = new int[10]();
编译罚款与VC9编译器和初始化的整数为0。所以,我的问题是:是新的int [10]()有效的C++吗?
new int;
或new int();
是否有任何区别? 后者保证初始化 的变量吗?首先是这个有效的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
不会初始化的内存。
如果我可以推测将会有点(我敢肯定,如果我错了,我会被纠正):
后者()也值初始化(因为它被称为在standardese),这使得在这种情况下整数的值为0。
这是对标准(C++ 03?)的一个相当新的补充,所以旧的编译器可能不支持它,并且保持它的独立性。
我记得当从MSVS 2003切换到2005(我认为)时,得到了很多警告w.r.t,编译器说“这个成员现在不会被初始化,现在不是这样”。
从标准。 “默认初始化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*
是一个内置类型,它被初始化为零。
但我真的不确定。
这是有效的C++根据段落5.3.4/1,这是很难在这里引用由于特殊格式。
根据5.3.4/15的产品值初始化,如果使用形式(),见第8.5但短答案是肯定的。
是的,在第一种情况下,变量不是价值初始化的,可以是任何东西,第二种情况下它的值初始化为零。
尽管MSVS已经变得更符合每个版本的标准,但是没有像C++ 03标准那样的东西。 – Gorpik 2010-03-18 08:58:28
@Gorpik,目前的标准是ISO/IEC 14882:2003,如果你在一年之前使用命名标准的通用规则,它将是C++ 03,即使这不是正确的名称(因为下一个标准将会肯定不会被称为C++ 11,即使大多数人会这样称呼它) – 2010-03-18 09:28:50
对不起,你是对的。我忘记了2003年发布的标准修正案。 – Gorpik 2010-03-21 22:37:57