结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据,将数据的表示合并到一起。
结构是用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,可以创建这种类型的变量。
结构的定义如下面的例子:
struct inflatable // structure declaration
{
char name[20];
float volume;
double price;
};
定义结构后,可以创建该类型的变量:
inflatable hat;
inflatable woopie_cushion;
inflatable mainframe;
可以使用运算符 (.)来访问各个成员,如hat.volume
, vincent.price
。
C++ 11 也支持将列表初始化用于接口,且等号(=)是可选的:
inflatable duck {"Daphne", 0.12, 9.98}
如果大括号内未包含,各个成员都将被设置为零。
inflatable mayer {};
cout << "mayer.name: " << mayer.name << endl;
cout << "mayer.volume: " << mayer.volume << endl;
cout << "mayer.price" << mayer.price << endl;
运行结果:
mayer.name:
mayer.volume: 0
mayer.price: 0
可以使用(=)将架构赋给另一个同类型的结构,这样结构中每一个成员都将被设置为另一个结构中相应成员的值,即使成员是数组,这种赋值被称为成员赋值。
可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如,创建一个100个 inflatable 结构的数组,可以:
inflatable gifts[100];
gift 本身是一个数组,不是结构,gifts.price 是无效的。
初始化结构数组,可以结合使用初始化数组的规则和初始化结构的规则:
inflatable guest[2] =
{
{"Bambi", 0.5, 21.99},
{"Godzilla", 2000, 565.99}
};
C++ 可以指定占用特定位数的结构成员,使得创建与某个硬件设备上的寄存器对应的数据结构非常方便:
struct torgle_register
{
unsigned int SN : 4; // 4 bits for SN value
unsigned int : 4; // 4 bits unused
bool goodIn : 1; // valid input (1 bit)
bool goodTorgle : 1; // successful torgling
}
共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。比如,结构可以同时存储 int、long 和 double,共用体只能存储 int、long 或 double。
union one4all
{
int int_val;
long long_val;
double double_val;
};
可以使用 one4all 变量来存储 int、long 或 double,条件是在不同时间进行:
one4all pail;
pail.int_val = 15; // store a int
cout << pail.int_val << endl;
pail.double_val = 1.38; // store a double, int value is lost
cout << pail.double << endl;
C++ 的 enum 工具提供了另一种创建符号常量的方式,这种方式可以代替 const。使用 enum 的句法与使用结构相似:
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
这条语句完成两项工作:
可以使用枚举名来声明这种类型的变量:
spectrum band; // band a variable of type spectrum
在不执行强制类型转换的情况下,只能将定义枚举是使用的枚举量赋给这种枚举的变量:
band = blue; // valid, blue is an enumerator
band = 2000; // invalid, 2000 not an enumerator
枚举量是整型,可被提升为 int 类型,但 int 类型不能自动转换为枚举类型:
int color = blue; // valid, spectrum type promoted to int
band = 3; // invalid, int not converted to spectrum
color = 3 + red; // valid, red converted to int
可以使用赋值运算符来显式地设置枚举量的值:
enum bits{one = 1, two = 2, four = 4, eight = 8};
指定的值必须是整数,也可以只显式地定义其中一些枚举量的值:
enum bigstep {first, second = 10, third};
这里,first 在这种情况下为 0。后面没有被初始化的枚举量的值将比前面的枚举量大 1。因此,third 的值为 101。
可以创建多个值相同的枚举量
enum {zero, null = 0, one, numero_uno = 1};
其中,zero 和 null 都为 0,one 和 numero_uno 都为 1。
C++ 可以通过强制转换,增加可赋给枚举量的合法值。每个枚举都有取值范围,通过强制类型转换,可以在取值范围中的任何整数值赋给枚举变量,即使这个是不是枚举值。
enum bits{one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6);
这里 6 不是枚举值,但它位于枚举定义的取值范围内。
取值范围的上限,为大于枚举量最大值的,最小 2 次幂减 1。例如最大枚举值为 101,在 2 次幂中比这个数大的最小值为 128,因此上限为 127。
取值范围的下限。如果最小值不小于 0,下限为 0。否则采取找上限的方式但加上负号。例如,最小枚举量为 -6,而比它小的、最大的 2 次幂是 -8,因此下限为 -7。