结构体的定义
结构体是由若干个数据“合起来”组成的一种新类型。这些数据被称为结构体的成员(Member)。若想定义一个新的结构体类型,你需要这样写:
struct 结构体类型名 { 成员列表 };
其中,结构体类型名 是一个引入的类型名,它遵循和变量名相同的命名规则。成员列表 是一系列可选的带初始化器的声明,比如:
定义了一个叫做 Coordinate 的新类型,它包含 x y z 三个 int 类型的成员。声明并定义一个结构体类型的变量也很简单,直接:
Coordinate a;
和原来的写法是一样的。这里,a 的成员会这样初始化:若成员声明中带初始化器,则用初始化值初始化;若不带初始化器,则不进行初始化。比如这里 a 的 z 会被初始化为 42,但 x 和 y 的初值是不确定的。
你在定义结构体类型变量时,也可以带一个初始化器。初始化器中是一系列由逗号分隔的值,它们会依次初始化每一个成员。比如:
这时,bob 的 number 成员被初始化为 12345,而 name 成员则被初始化为 "Bob"。
这是聚合初始化。能够使用聚合初始化的前提是没有显式给出的构造函数;然而在面向对象编程中这很罕见。所以在之后的学习中我们可能很少使用聚合初始化。
结构体的声明
你也可以只声明而不定义结构体:
struct Student;
即不写出成员列表。像这种只声明却没有定义的结构体类型是不完整类型(Incomplete type),而不完整类型是没有办法直接用的(因为没有定义)——即 A sth; 是报编译错误的。
注意事项
我在这里建议读者,将结构体的定义写在全局作用域内。即:
这样做的原因是,我们可以在所有的函数中使用这个结构体类型:
定义在函数内的结构体称为“局部类”(Local class),有一定的语法限制且并不常用。