当前位置:   article > 正文

C++初学(9)

C++初学(9)

9.1、结构简介

虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C++的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据。

下面给个结构:

  1. struct inflatable
  2. {
  3. char name[20];
  4. float volume;
  5. double price;
  6. };

关键字struct表明,这些代码定义的是一个结构。标识符inflatable是这种数据格式的名称,因次新类型的名称为inflatable。这样就可以像创建char或int类型那样创建inflatable类型的变量。该结构里面的char数组、一个float和一个double每一项都被称为结构成员。

  1. inflatable hat;
  2. inflatable woopie_cushion;
  3. inflatable mainframe;

C++允许在声明变量中时省略关键字struct,在C++中,结构标记的用法与基本类型名相同。

由于hat的类型是inflatable,因此可以用成员运算符(.)来访问各个成员。hat是一个结构,hat.price是一个double类型的变量,可以通过成员名来访问结构的成员。

9.1.1、在程序中使用结构

下面给一个程序:

  1. #include <iostream>
  2. struct inflatable
  3. {
  4. char name[20];
  5. float volume;
  6. double price;
  7. };
  8. int main()
  9. {
  10. using namespace std;
  11. inflatable guest =
  12. {
  13. "Glorious Gloria",
  14. 1.88,
  15. 29.99
  16. };
  17. inflatable pal =
  18. {
  19. "Audacious Arthur",
  20. 3.12,
  21. 32.99
  22. };
  23. cout << "Expand your guest list with " << guest.name;
  24. cout << " and " << pal.name << "!" << endl;
  25. cout << "You can have both for $";
  26. cout << guest.price + pal.price << "!" << endl;
  27. return 0;
  28. }

结构声明的位置很重要。对于程序来说,有两种选择。一种是将声明放在main()函数中,紧跟在开始括号的后面;另一种选择是将声明放到main()的前面。

该程序用的是第二种,被称为外部声明(当然还有一种说法是全局声明)。第一种则被称为内部声明。两者来说差别挺大的,外部声明可以被其后面的任意函数使用,而内部声明只能被该声明所属的函数使用。因此我们一般用外部声明。

结构的初始化方式:

  1. inflatable guest =
  2. {
  3. "Glorious Gloria",
  4. 1.88,
  5. 29.99
  6. };

和数组一样,使用有逗号分隔值列表,并将这些值用花括号括起。在该程序中,每个值占一行,但也可以将它们全部放到同一行中。只是应用逗号将它们分开:

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++可以将结构作为参数传递给函数,也可以让函数返回一个结构。另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值。

下面给一段代码:

  1. #include <iostream>
  2. struct inflatable
  3. {
  4. char name[20];
  5. float volume;
  6. double price;
  7. };
  8. int main()
  9. {
  10. using namespace std;
  11. inflatable bouquet =
  12. {
  13. "sunflowers",
  14. 0.20,
  15. 12.49
  16. };
  17. inflatable choice;
  18. cout << "bouquet: " << bouquet.name << " for $";
  19. cout << bouquet.price << endl;
  20. choice = bouquet;
  21. cout << "choice: " << choice.name << " for $";
  22. cout << choice.price << endl;
  23. return 0;
  24. }

从中可以看出,成员赋值是有效的,因为choice结构的成员值和bouquet结构中的值相同。

如果需要同时完成定义结构和创建结构变量的工作,只需要将变量名放在结束括号的后面即可:

  1. struct perks
  2. {
  3. int key_number;
  4. char car[10];
  5. }my_smith,my_opinion;

然而将结构变量和变量声明分开,可以使程序更易于阅读和理解。C语言介绍结构体时应该会教一下创建单独的结构变量,后面可能不会这么创建。

9.1.5、结构数组

inflatable结构包含一个数组,当然我们也可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如:

inflatable gifts[100];

这样gifts将是一个inflatable数组,其中的每个元素都是inflatable对象,可以与成员运算符一起使用:

  1. cin>>gifts[0].volume;
  2. cout<<gifts[99].price<<endl;

注意:gifts是一个数组,不是结构!不是结构!不是结构!因此gifts.price是无效的。

要初始化结构数组,可以使用初始化数组的规则和初始化结构的规则。由于数组中的每个元素都是结构,因此可以使用结构初始化的方式来提供它的值。

  1. inflatable guests[2]=
  2. {
  3. {"Bambi",0.5,21.99};
  4. {"Godzilla",2000,565.99};
  5. };
  1. #include <iostream>
  2. struct inflatable
  3. {
  4. char name[20];
  5. float voulume;
  6. double price;
  7. };
  8. int main()
  9. {
  10. using namespace std;
  11. inflatable guests[2] =
  12. {
  13. {"Bambi",0.5,21.99},
  14. {"Godzilla",2000,565.99}
  15. };
  16. cout << "The guests " << guests[0].name << " and " << guests[1].name
  17. << "\nhave a combined volume of "
  18. << guests[0].voulume + guests[1].voulume << " cubic feet." << endl;
  19. return 0;
  20. }

9.1.6、结构中的为字段

C++允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。每个成员都被称为位字段。下面是一个例子:

  1. struct torgle_register
  2. {
  3. unsigned int SN:4;
  4. unsigned int :4;
  5. bool goodIn:1;
  6. bool goodTorgle:1;
  7. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/924477
推荐阅读
相关标签
  

闽ICP备14008679号