2014-09-30 54 views
0

如何以更标准的方式清零包含其他结构,数组等的整个结构对象数组?如何清零包含其他结构和数组的整个结构对象数组?

在我的情况下,它是INPUT结构的一个对象。

下面的代码是正确的吗?

INPUT newline_input[4] = {0}; 

还是应该使用类似std::memset的东西?

在此先感谢。

INPUT

+0

它取决于INPUT是什么,通常使用构造函数将对象设置为一个良好定义的状态。 – Surt 2014-09-30 08:11:47

+0

@Surt http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx – FrozenHeart 2014-09-30 08:21:30

+0

如果INPUT是一个具有默认构造函数的类,则不需要任何' =' – 2014-09-30 09:29:32

回答

3

您的代码定义将工作,更妙的是这样的:

INPUT newline_input[4] = {}; 
+0

为什么它更好? – FrozenHeart 2014-09-30 08:47:05

+0

因为它不要求第一个元素可以从0开始构建。 – 2014-09-30 08:57:24

0

至于我只能看到第一个数组元素的第一个元素将被设置为值,所以只是因为它在这里设置为零,这是正确的。如果它是'= {1}',并且您预期所有元素均为1,则会失败,因为元素为{1,0,0,0 ...等}

我不喜欢'='因为它看起来像会调用一个赋值操作符(这与此结构无关,但在其他情况下可能是一个问题)。

如果数组是全局数组,它的内存将被清零,但意外的是所需值为零。如果数组在堆栈上随机值(无论在堆栈上)将填充数组。

在C++ 14时代初始化它有点复杂。

INPUT newline_input[4] {}; // empty value initialization 

所以用于数据空value initialization其中包括一个union语法4用于

T object {}; 

然后实现3,接着加入2-(C++ 14)

3) If T is an array type, each element of the array is value-initialized 
2) If T is a class type without a user-provided or deleted default constructor (that is, it may be a class with a defaulted default constructor or with an implicitly-defined one) then the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor (since C++14) 

哪应该叫zero-initialization

由于程序员必须知道如何将它们置于明确定义的状态,因此这些具有未知内容的工会在没有构造函数的情况下提供是一个问题。

使用列表初始化看起来太像分配和

INPUT newline_input[4] = {0}; 
or 
INPUT newline_input[4] = {}; 

它将List initialization随后aggregate initialization作为输入数组/结构/联合使用语法10。而且,由于初始化子句的数目小于所述阵列的长度,这样效果会被用于

如果初始化子句的数目小于 成员或初始化子句的数量是完全空的,剩余的 构件如果在类定义中提供了 ,并且否则(自C++ 14)通过空的 列表(它们执行值初始化)来初始化它们的大括号或相等初始值设定项。如果参考 类型的成员是这些剩余的成员之一,该程序是形成不良的 (引用不能值初始化)

但是标准礼让的成员已经从这种形式移开[链接到Bjarne S.所说的]到初始值的位置。

+0

'T a [n] = {..};'不调用赋值操作符。 – 2014-09-30 09:30:08

+0

@NeilKirk,更正。 – Surt 2014-09-30 10:06:54

+0

我不遵循“C++ 14的年龄”的东西。他强烈建议他的班级是PODS;在这种情况下,除了额外的语法外,C++ 11/C++ 14不会改变任何内容。 – 2014-09-30 10:43:26