第13章总结
本节阅读量:章节回顾
程序定义类型(也称为用户定义类型)是一种自定义类型,我们可以创建它以在自己的程序中使用。枚举类型和类类型(包括结构体、类和联合)允许创建程序定义的类型。
必须先定义程序定义的类型,然后才能使用它们。程序定义类型的定义称为类型定义。类型定义不受单定义规则的约束。
枚举(也称为枚举类型)是一种复合数据类型,其中每个可能的值都定义为符号常量(称为枚举元素)。不同枚举是不同的类型,这意味着编译器可以将它们与其他类型区分开来(与类型别名不同)。
非限定作用域枚举之所以如此命名,是因为它们将其枚举元素名称放入与枚举定义本身相同的作用域中(而不是像命名空间那样创建新的作用域)。它还为其枚举元素提供命名空间。非限定作用域枚举将隐式转换为整数值。
限定作用域枚举的工作方式类似于非限定作用域枚举,但不会隐式转换为整数,并且枚举元素仅放在枚举的作用域中(而不是放在定义枚举的作用域中)。
struct(structure的缩写)是一种程序定义的数据类型,它允许将多个变量绑定到一个类型中。作为结构体(或类)一部分的变量称为数据成员(或成员变量)。为了访问特定的成员变量,在结构体变量名称和成员名称(对于普通结构体和引用)之间使用成员选择操作符(操作符.),或者指针操作符(运算符->)(对于结构体的指针)。
在一般编程中,聚合数据类型(也称为聚合)是可以包含多个数据成员的任何类型。在C++中,只有C样式数组和结构体是聚合类型。
聚合可以使用一种称为聚合初始化的初始化形式,它允许直接初始化聚合的成员。为此,需要提供了一个初始化列表,它只是一个逗号分隔值的列表。聚合初始化执行成员级初始化,这意味着结构体中的每个成员都是按声明的顺序初始化的。
在C++20中,指定初始值设定项允许您显式定义哪些初始化值映射到哪些成员。成员必须按照在结构中声明的顺序进行初始化,否则将导致错误。
当定义结构体(或类)类型时,可以为每个成员提供默认的初始化值,作为类型定义的一部分。该过程称为非静态成员初始化,初始化值称为成员默认初始值设定项。
出于性能原因,编译器有时会在结构体中添加间隙(这称为填充),因此结构体的大小可能大于其成员大小的总和。
类模板是用于实例化类类型(结构体、类或联合)的模板定义。类模板参数推导(CTAD)是C++17的一个功能,它允许编译器从初始值设定项中推导模板类型参数。
