在C ++中,如果我以" = {}"的形式初始化结构,如下例所示,是否确保为结构的所有成员赋值为零? 我理解这似乎是重复的问题,但我的问题是,如果它对所有成员初始化为零,它是否也适用于复杂的结构? 像结构中的结构一样,或者为此,每个成员必须在代码中明确赋值为零。
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
编辑:引用复杂结构,
typedef struct scomplex{
s initial;
s t[5];
};
int main (void)
{
scomplex sc = {};
printf ("%d %d %d",sc.initial.i, sc.initial.x, sc.t[0].i);
}
答案 0 :(得分:8)
但我的问题是,如果它对所有成员初始化为零,它是否也适用于复杂的结构?
是的,所有成员都将被初始化,包括"复杂"成员,但可能不会被初始化为零,最终效果取决于他们的类型。
根据您的示例代码,struct s
是一种聚合类型,然后执行aggregate initialization。
(强调我的)
如果初始化程序子句的数量少于成员数
and bases (since C++17)
或初始化程序列表完全为空,则其余成员and bases (since C++17)
将被初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)
按空列表,按照通常的list-initialization规则(对非类类型执行值初始化,使用默认构造函数执行非聚合类,以及聚合的聚合初始化)。 / p>
对于这种情况,结构i
的成员x
和s
将value initialized为零。
4)否则,该对象被零初始化。
如果struct s
有任何其他成员,则它们将被递归地用空列表初始化(值初始化或根据其类型初始化聚合)。
修改强>
对于您添加的示例(结构scomplex
),成员initial
将为value initialized,最终效果取决于类型s
。另一个成员是一个数组,它将是aggregate initialized的空列表,并且数组的所有元素都将被初始化值;与成员initial
相同,效果取决于类型s
。
答案 1 :(得分:5)
这会将所有成员初始化为0吗?
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
答案:是的。证明? Here 您可以看到它变为0。
这是一个自以为是的部分。但是在我的意见(IMO)中,用{0}
初始化它比{}
更具可读性,因为它通知用户0.它实际上正在填充0。
s initial = {0};
这被称为Aggregate Initialization
,正如DieterLücking定义的那样,或Value Initialization
,正如songyuanyao指出的那样。它基本上是一种初始化形式,您可以使用您想要的值初始化结构。例如,让我们用值1而不是0来初始化它!你会这样做:
// Example program
#include <stdio.h>
#include <iostream>
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {1,1};
printf("%d %d", initial.i, initial.x);
}
您可以在此处看到已编译的 。如上所示,我正在进行1,1
这是正常的初始化。与0初始化相反,您不能像使用0一样轻松地初始化结构的所有部分。
what is aggregate initialization
What do the following phrases mean in C++: zero-, default- and value-initialization?
汇总初始化:
聚合初始化是列表初始化的一种形式,它初始化聚合。
价值初始化:
初始化值
这是使用空初始化程序构造变量时执行的初始化。