结构体
在实际问题中,一组数据可能具有不同的数据类型。假设要存储班上同学的信息,我们需要存储他(她)的姓名、性别、学号。我们希望有一种数据格式将所有信息存储到一个单元中。数组不能完成这项任务。而C++中的结构体可以满足要求。
1 | struct information |
结构体声明不会创建任何结构体的实例。本示例中的结构体声明只是告诉编译器information结构体看起来的样子。它本质上是创建一个名为information的新数据类型。结构体是用户定义的类型,而结构体声明定义了这种类型的数据属性。
在定义结构体时,系统对其不分配实际内存。只有定义结构体变量时,系统才为其分配内存。
结构体初始化
初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。
1 | information student = {"shangguan","女",10000}; |
也可以仅初始化结构体变量的部分成员。例如,如果仅知道他(她)的名字和性别,但不知道学号,则可以按以下方式定义和初始化变量:
1 | information student = {"shangguan","女"}; |
这里只有 name 和 gender 成员被初始化,number 成员未初始化。但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为未初始化。使用初始化列表时,C++不提供跳过成员的方法。以下语句试图跳过 gender 成员的初始化。这是不合法的。
1 | information student = {"shangguan",10000};//非法 |
还有一点很重要,在C++11之前不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:
1 | struct information |
C++11
但是,从C++11之后,编译器就支持在结构体的定义时进行成员初始化。
与数组一样,C++11也支持将列表初始化用于结构,且等号(=)是可选的。
1 | information student {"shangguan","女",10000}; |
其次,如果大括号内未包含任何东西,各个成员都将被设置为零。
备注:本人不能保证该文章和该文章中的代码无错误、无缺陷,请自行判断后使用。如遇到问题请联系本人。转载请标明出处。
参考文章:
- 《C++ Primer Plus(第六版)中文版》Stephen Prata 著
- C++结构体完全攻略(超详细)
- C++11允许定义结构体时给成员赋初始值
- C++11就地初始化与列表初始化