用全零初始化c++结构
C++ structure initialization with all zeros
在c++中,如果我以"={}"的形式初始化结构,如下例所示,它是否确保将值赋给结构的所有成员为0 ?我明白这似乎是重复的问题,但我的问题是,如果它对所有成员初始化为0,它是否也适用于复杂结构?就像结构中的结构一样,或者每个成员都必须在代码中显式地赋值为0 ?
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,它是否也适用于复杂结构?
是的,所有成员都将被初始化,包括"复杂"成员,但可能不会初始化为零,最终效果由其类型决定。
根据您的示例代码,struct s
是聚合类型,然后执行聚合初始化。
(强调我的)
如果初始化子句数少于
and bases (since C++17)
的成员数,或者初始化列表完全为空,则按照通常的列表初始化规则(对非类类型和非聚合类使用默认构造函数进行值初始化,对聚合类进行聚合初始化),用空列表初始化by their default initializers, if provided in the class definition, and otherwise (since C++14)
剩余的and bases (since C++17)
成员。
在这种情况下,s
的成员i
和x
将被初始化为0。
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);
}
回答:是的。证明吗?这里你可以看到它变成了0
其它更好的选择吗?
这是一个固执己见的部分。但在我看来,用{0}
初始化它会比{}
更具可读性,因为它会通知用户0。它实际上被0填满了
s initial = {0};
这叫什么?
这被称为Aggregate Initialization
,如Dieter lcking所定义的,或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那样简单地初始化结构体的所有部分。
cpprefrence
什么是聚合初始化
下列短语在c++中是什么意思:零初始化、默认初始化和值初始化?
词汇表
Aggregate Initialization:
<聚合初始化是列表初始化的一种形式,用于初始化聚合。
值初始化/strong>:
初始化值
这是用空初始化式构造变量时执行的初始化。
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?