Jus*_*ust 2 c++ struct initialization
在C++中如果我以"= {}"的形式初始化结构,如下例所示,它是否确保为结构的所有成员赋值为零?我理解这似乎是重复的问题,但我的问题是,如果它对所有成员初始化为零,它是否也适用于复杂的结构?像结构中的结构一样,或者为此,每个成员必须在代码中明确赋值为零?
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
Run Code Online (Sandbox Code Playgroud)
编辑:参考复杂的结构,
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);
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是,如果它对所有成员初始化为零,它是否也适用于复杂的结构?
是的,所有成员都将被初始化,包括"复杂"成员,但可能不会被初始化为零,最终效果取决于他们的类型.
根据您的示例代码,struct s是聚合类型,然后执行聚合初始化.
(强调我的)
如果初始化条款的数目小于成员的数量
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)由空列表,按照通常的列表初始化规则(其执行值初始化用于非类类型和具有默认构造函数的非聚合类,以及聚合的聚合初始化).
对于这种情况,成员i和x结构s将值初始化为零.
4)否则,对象是零初始化的.
如果struct s有任何其他成员,则它们将被递归地初始化(初始化值或根据其类型初始化聚合).
编辑
对于添加的样本(struct scomplex),成员initial将被初始化值,最终效果取决于类型s.另一个成员是一个数组,它将使用空列表进行聚合初始化,并且数组的所有元素都将被初始化值; 与成员相同initial,效果取决于类型s.
这会将所有成员初始化为0吗?
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
Run Code Online (Sandbox Code Playgroud)
答:是的.证明?在这里你可以看到它变为0.
这是一个自以为是的部分.但是在我的意见(IMO)中,初始化它{0}会比{}它更具可读性,因为它通知用户0.它实际上正在填充0.
s initial = {0};
Run Code Online (Sandbox Code Playgroud)
这Aggregate Initialization就像DieterLücking所定义的那样,或者Value Initialization像宋元尧所说的那样.它基本上是一种初始化形式,您可以使用您想要的值初始化结构.例如,让我们用值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);
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到这个.正如您在上面所看到的,我正在做的1,1是正常的初始化.与0初始化相反,您不能像使用0一样轻松地初始化结构的所有部分.
聚合初始化:
聚合初始化是列表初始化的一种形式,它初始化聚合.
价值初始化:
初始化值
这是使用空初始化程序构造变量时执行的初始化.