9.1、结构简介
虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C++的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据。
下面给个结构:
struct inflatable
{
char name[20];
float volume;
double price;
};
关键字struct表明,这些代码定义的是一个结构。标识符inflatable是这种数据格式的名称,因次新类型的名称为inflatable。这样就可以像创建char或int类型那样创建inflatable类型的变量。该结构里面的char数组、一个float和一个double每一项都被称为结构成员。
inflatable hat;
inflatable woopie_cushion;
inflatable mainframe;
C++允许在声明变量中时省略关键字struct,在C++中,结构标记的用法与基本类型名相同。
由于hat的类型是inflatable,因此可以用成员运算符(.)来访问各个成员。hat是一个结构,hat.price是一个double类型的变量,可以通过成员名来访问结构的成员。
9.1.1、在程序中使用结构
下面给一个程序:
#include <iostream>
struct inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
using namespace std;
inflatable guest =
{
"Glorious Gloria",
1.88,
29.99
};
inflatable pal =
{
"Audacious Arthur",
3.12,
32.99
};
cout << "Expand your guest list with " << guest.name;
cout << " and " << pal.name << "!" << endl;
cout << "You can have both for $";
cout << guest.price + pal.price << "!" << endl;
return 0;
}
结构声明的位置很重要。对于程序来说,有两种选择。一种是将声明放在main()函数中,紧跟在开始括号的后面;另一种选择是将声明放到main()的前面。
该程序用的是第二种,被称为外部声明(当然还有一种说法是全局声明)。第一种则被称为内部声明。两者来说差别挺大的,外部声明可以被其后面的任意函数使用,而内部声明只能被该声明所属的函数使用。因此我们一般用外部声明。
结构的初始化方式:
inflatable guest =
{
"Glorious Gloria",
1.88,
29.99
};
和数组一样,使用有逗号分隔值列表,并将这些值用花括号括起。在该程序中,每个值占一行,但也可以将它们全部放到同一行中。只是应用逗号将它们分开:
inflatable duck={"Daphne",0.12,9.98};
9.1.2、C++11结构初始化
与数组一样,C++也支持将列表初始化用于结构,且等号(=)是可选的:
inflatable duck{"Daphne",0.12,9.98};
如果大括号内没有任何东西,各个成员都将被设置为0。
9.1.3、结构可以将string类作为成员吗
答案是可以的。一定要让结构定义能够访问名称空间std。可以将using namespace std;放到结构初始化前面,或者将name的类型声明为std::string。
9.1.4、其他结构属性
C++可以将结构作为参数传递给函数,也可以让函数返回一个结构。另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值。
下面给一段代码:
#include <iostream>
struct inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
using namespace std;
inflatable bouquet =
{
"sunflowers",
0.20,
12.49
};
inflatable choice;
cout << "bouquet: " << bouquet.name << " for $";
cout << bouquet.price << endl;
choice = bouquet;
cout << "choice: " << choice.name << " for $";
cout << choice.price << endl;
return 0;
}
从中可以看出,成员赋值是有效的,因为choice结构的成员值和bouquet结构中的值相同。
如果需要同时完成定义结构和创建结构变量的工作,只需要将变量名放在结束括号的后面即可:
struct perks
{
int key_number;
char car[10];
}my_smith,my_opinion;
然而将结构变量和变量声明分开,可以使程序更易于阅读和理解。C语言介绍结构体时应该会教一下创建单独的结构变量,后面可能不会这么创建。
9.1.5、结构数组
inflatable结构包含一个数组,当然我们也可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如:
inflatable gifts[100];
这样gifts将是一个inflatable数组,其中的每个元素都是inflatable对象,可以与成员运算符一起使用:
cin>>gifts[0].volume;
cout<<gifts[99].price<<endl;
注意:gifts是一个数组,不是结构!不是结构!不是结构!因此gifts.price是无效的。
要初始化结构数组,可以使用初始化数组的规则和初始化结构的规则。由于数组中的每个元素都是结构,因此可以使用结构初始化的方式来提供它的值。
inflatable guests[2]=
{
{"Bambi",0.5,21.99};
{"Godzilla",2000,565.99};
};
#include <iostream>
struct inflatable
{
char name[20];
float voulume;
double price;
};
int main()
{
using namespace std;
inflatable guests[2] =
{
{"Bambi",0.5,21.99},
{"Godzilla",2000,565.99}
};
cout << "The guests " << guests[0].name << " and " << guests[1].name
<< "\nhave a combined volume of "
<< guests[0].voulume + guests[1].voulume << " cubic feet." << endl;
return 0;
}
9.1.6、结构中的为字段
C++允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。每个成员都被称为位字段。下面是一个例子:
struct torgle_register
{
unsigned int SN:4;
unsigned int :4;
bool goodIn:1;
bool goodTorgle:1;
};