10.x - 小结与测试 - 枚举和结构体
- 用户定义类型是一种自定义类型,我们可以在程序中创建它用于某些目的。基于枚举类型和class类型(包括结构体、类和联合)我们可以创建需要的自定义类型。自定义类型在使用前必须先定义,定义它的过程则称为类型定义。类型定义不需要遵循单一定义规则(one-definition-rule)。
10.2 - 无作用域枚举类型 10.3 - 限定作用域枚举类型的输入输出
- 枚举(称为枚举类型或enum)是一种复合数据类型,它的每个可能值都被定义为符号常量(称为枚举值)。枚举值是一种确切的数据类型,也就是说编译器可以区分它和其他类型(不像类型别名那样)。
- 无作用域枚举类型会将自己的枚举值名称导入到与自己相同的作用域中(而不是像命名空间那样创建新的作用域区域)。无作用域枚举会被隐式转换为整型数。
10.4 - 限定作用域枚举(枚举类) - 限定作用域枚举 与无作用域枚举的工作原理类似,但它们是强类型的(它们不会隐式转换为整数)和强作用域的(枚举数只放在枚举的作用域区域中)。
- 结构体是一种自定义类型,使用它可以将多个变量打包为一个单独的类型。变量是结构体(或类)的一部分,称为数据成员或成员变量。访问成员函数需要在结构体变量名(普通结构体或结构体引用)和成员名之间使用成员选择运算符(
operator .
),或者使用指针运算符(operator->
) (对于结构体指针而言)。
- 在一般编程领域,聚合数据类型(通常称为聚合)是指任何可以包含多个数据成员的类型。在 C++ 中,只包含数据成员的数组和结构体是聚合。
- 聚合使用一种被称为聚合初始化的初始化形式,使用聚合初始化可以直接初始化聚合的成员。为此,我们需要提供一个初始化列表作为初始化值,而所谓初始化列表就是一个以逗号分割值的列表。聚合初始化使用成员依次初始化方式,即结构体的每个成员依照其声明顺序进行初始化。
- 在 C++20 中,使用指定初始化可以显式地指定将初始化值映射到哪个成员。结构体成员必须按照声明的顺序初始化,否则会报错。
- 定义结构(或类)类型时,可以为每个成员提供默认初始化值,作为类型定义的一部分。这个过程称为非静态成员初始化,初始化值称为默认成员初始化值。
- 出于性能原因,编译器有时会在结构中添加间隙(这称为填充),因此结构体的大小可能大于其成员的大小之和。
- 类模板是实例化类类型(结构、类或联合)的模板定义。类模板实参推断(CTAD)是 C++17的一个特性,它允许编译器从初始化式中推断模板类型实参。