在尝试回答this问题时,我发现代码int* p = new int[10]();
可以很好地编译VC9编译器并将整数初始化为0.所以我的问题是:
new int;
还是new int();
?是否
后者保证初始化
变量?答案 0 :(得分:29)
首先是这个有效的C ++还是微软扩展?
它在C ++中有效,标准的相关部分是5.3.4,第一段包含语法
是否可以保证初始化数组的所有元素?
是。第5.3.4 / 15段指出
创建类型为T的对象的new-expression初始化该对象,如下所示:
...
- 如果new-initializer的格式为(),则该项值已初始化(8.5)
其中为POD初始化的值意味着零初始化。
另外,如果我做新的int有什么区别;或者新的int();?后者是否保证初始化变量?
是的,他们是不同的。根据上面引用的new int()
,将初始化整数。在同一段的前一个块中:
如果省略new-initializer:
如果T是(可能是cv限定的)非POD类类型(或其数组),则该对象是默认初始化的(8.5)。如果T是const限定类型,则底层类类型应具有用户声明的默认构造函数。
否则,创建的对象具有不确定的值。如果T是const限定类型,或者包含(直接或间接)const限定类型成员的(可能是cv限定的)POD类类型(或其数组),则该程序格式不正确;
所以new int
不会初始化内存。
答案 1 :(得分:2)
从标准来看。 “默认初始化T类型的对象意味着: - 如果T是非POD类类型 [像vector这样的情况],调用T的默认构造函数。“
构造函数表达式T()
用于表示类型T的默认值,对于内置类型,它为零,用户定义类型的默认构造函数为零。构造POD()
产生值初始化并根据标准,这导致所有成员和子成员默认构造或零初始化。
这就是为什么你的陈述是合法的,但按照标准初始化为零;需要一些详细的查找恕我直言。
但是,我在标准中找不到它定义内置类型的默认构造的含义。
修改: - 强>
struct S { int x; };
void f () {
S s1; // s1.x is uninitialized here
S s2 = S(); // s2.x is zero here
}
我认为我们经常自己解释应用于内置类型的默认构造意味着什么;因为C ++标准没有定义它(至少我找不到它)而且我记得 Stroustrup 或 Josuttis 说它意味着T()
被描述为对于内置类型,值初始化是“零转换为类型T ”。
由于int*
是内置类型,因此它被初始化为零。
但我真的不确定。
答案 2 :(得分:1)
根据第5.3.4 / 1段这是有效的C ++,由于特殊的格式化,这里很难引用。
根据5.3.4 / 15,如果使用form(),则该项目已初始化,见第8.5段,但简短答案为是。
是的,第一种情况是变量不是值初始化并且可以是任何东西,在第二种情况下,它的值已初始化并且将为零。
答案 3 :(得分:0)
如果我有点猜测(如果我错了,我肯定会纠正的):
后者()执行值初始化(因为它在standardese中调用),这使得整数在这种情况下的值为0。
这是对标准(C ++ 03?)的一个相当新的补充,因此较旧的编译器可能不支持它,并使其保持单向化。
我记得在从MSVS 2003切换到2005(我认为)时会收到很多警告,编译器说“现在这个成员将被零初始化,而不是之前”。