浅谈C++结构体初始化

结构体

在实际问题中,一组数据可能具有不同的数据类型。假设要存储班上同学的信息,我们需要存储他(她)的姓名、性别、学号。我们希望有一种数据格式将所有信息存储到一个单元中。数组不能完成这项任务。而C++中的结构体可以满足要求。

1
2
3
4
5
6
struct information
{
string name;
string gender;
int number;
};

结构体声明不会创建任何结构体的实例。本示例中的结构体声明只是告诉编译器information结构体看起来的样子。它本质上是创建一个名为information的新数据类型。结构体是用户定义的类型,而结构体声明定义了这种类型的数据属性。

在定义结构体时,系统对其不分配实际内存。只有定义结构体变量时,系统才为其分配内存。


结构体初始化

初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。

1
information student = {"shangguan","女",10000};

也可以仅初始化结构体变量的部分成员。例如,如果仅知道他(她)的名字和性别,但不知道学号,则可以按以下方式定义和初始化变量:

1
information student = {"shangguan","女"};

这里只有 name 和 gender 成员被初始化,number 成员未初始化。但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为未初始化。使用初始化列表时,C++不提供跳过成员的方法。以下语句试图跳过 gender 成员的初始化。这是不合法的。

1
information student = {"shangguan",10000};//非法

还有一点很重要,在C++11之前不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:

1
2
3
4
5
6
struct information
{
string name;
string gender;
int number = 10000;
};

C++11

但是,从C++11之后,编译器就支持在结构体的定义时进行成员初始化。

与数组一样,C++11也支持将列表初始化用于结构,且等号(=)是可选的。

1
information student {"shangguan","女",10000};

其次,如果大括号内未包含任何东西,各个成员都将被设置为零。


备注:本人不能保证该文章和该文章中的代码无错误、无缺陷,请自行判断后使用。如遇到问题请联系本人。转载请标明出处。

参考文章: