赞
踩
虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放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类型的变量,可以通过成员名来访问结构的成员。
下面给一个程序:
- #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};
与数组一样,C++也支持将列表初始化用于结构,且等号(=)是可选的:
inflatable duck{"Daphne",0.12,9.98};
如果大括号内没有任何东西,各个成员都将被设置为0。
答案是可以的。一定要让结构定义能够访问名称空间std。可以将using namespace std;放到结构初始化前面,或者将name的类型声明为std::string。
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语言介绍结构体时应该会教一下创建单独的结构变量,后面可能不会这么创建。
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;
- }
C++允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。每个成员都被称为位字段。下面是一个例子:
- struct torgle_register
- {
- unsigned int SN:4;
- unsigned int :4;
- bool goodIn:1;
- bool goodTorgle:1;
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。