当前位置: 首页 > news >正文

C++初学(9)

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;
};

http://www.lryc.cn/news/414342.html

相关文章:

  • ardupilot开发 --- 网络技术综述 篇
  • 一文详解大模型蒸馏工具TextBrewer
  • Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
  • ChatGPT能代替网络作家吗?
  • Http自定义Header导致的跨域问题
  • python 中 file.read(), file.readline()和file.readlines()区别和用法
  • python 学习: np.pad
  • 等保2.0 | 人大金仓数据库测评
  • AIGC赋能智慧农业:用AI技术绘就作物生长新蓝图
  • yolov8蒸馏(附代码-免费)
  • Flink-StarRocks详解:第五部分查询数据湖(第55天)
  • 【MySQL】常用数据类型
  • 创建第一个rust tauri项目
  • 【课程总结】day19(中):Transformer架构及注意力机制了解
  • 4.4 标准正交基和格拉姆-施密特正交化
  • spring事务的8种失效的场景,7种传播行为
  • 进程的虚拟内存地址(C++程序的内存分区)
  • 英特尔移除超线程与AMD多线程性能对比
  • 定期自动巡检,及时发现机房运维管理中的潜在问题
  • 八股文(一)
  • 灵茶八题 - 子数组 ^w^
  • git clone private repo
  • vue3+ts+pinia+vant-项目搭建
  • 自动化测试概念篇
  • Mojo值的生命周期(Life of a value)详解
  • java对接kimi详细说明,附完整项目
  • 鸿蒙媒体开发【基于AVCodec能力的视频编解码】音频和视频
  • django集成pytest进行自动化单元测试实战
  • 48天笔试训练错题——day40
  • LabVIEW在DCS中的优势