C++ Primer Plus 学习笔记(复合类型)(二)

1. 结构(结构体)

结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据,将数据的表示合并到一起。

结构是用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,可以创建这种类型的变量。


1. 1 结构的定义方法

结构的定义如下面的例子:

struct inflatable   // structure declaration
{
    char name[20];
    float volume;
    double price;
};

定义结构后,可以创建该类型的变量:

inflatable hat;
inflatable woopie_cushion;
inflatable mainframe;

可以使用运算符 (.)来访问各个成员,如hat.volume, vincent.price

1. 2 结构的初始化

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

可以使用(=)将架构赋给另一个同类型的结构,这样结构中每一个成员都将被设置为另一个结构中相应成员的值,即使成员是数组,这种赋值被称为成员赋值。

1. 3 结构数组

可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如,创建一个100个 inflatable 结构的数组,可以:

inflatable gifts[100];

gift 本身是一个数组,不是结构,gifts.price 是无效的。
初始化结构数组,可以结合使用初始化数组的规则和初始化结构的规则:

inflatable guest[2] = 
{
    {"Bambi", 0.5, 21.99},
    {"Godzilla", 2000, 565.99}
};

1. 4 结构中的位字段

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
}

2. 共用体

共用体(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;    

3. 枚举

C++ 的 enum 工具提供了另一种创建符号常量的方式,这种方式可以代替 const。使用 enum 的句法与使用结构相似:

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

这条语句完成两项工作:

  • 让 spectrum 称为新类型的名称;spectrum 被称为枚举(enumeration),就像 struct 变量被称为结构以一样。
  • 将 red、orange、yellow 等作为符号常量,他们对应整数值 0 ~ 7。这些常量叫做枚举量(enumerator)。

可以使用枚举名来声明这种类型的变量:

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。

你可能感兴趣的:(C++)