C++初学(9)

news2024/11/14 14:20:11

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.coloradmin.cn/o/1972819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防御笔记第九天(持续更新)

注意&#xff1a;攻击可能只是一个点&#xff0c;而防御需要全方面进行。 1.IAE引擎 2.DPI DPI ----深度包检测 --- 针对完整的数据包&#xff0c;进行内容的识别和检测 3.基于特征字的检测技术 4&#xff0c;基于应用网关的检测技术 基于应用网关的检测技术 --- 有些应用控…

数据库方言

数据库方言&#xff0c;也称数据库领域特定语言&#xff08;DSL&#xff09;&#xff0c;是针对特定数据库系统的专有扩展或子集&#xff0c;它允许用户在特定环境内使用更高效、更简洁的查询语句。 关键字&#xff08;Keywords&#xff09; 关键字是数据库方言中预定义的单词&…

Windows 安装Redis7.4版本图文教程

本章教程&#xff0c;主要介绍如何在Windows上安装Redis7.4版本的Redis&#xff0c;并以服务方式实现开机自启动。 1、下载安装包 通过百度网盘分享的文件&#xff1a;Redis-7.4.0-Windows-x64-cygwin-with-Service.zip 链接&#xff1a;https://pan.baidu.com/s/1NFGXrCwumDzl…

【计算机毕业设计】703学生考勤管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

软件测试 -- 黑盒、灰盒、白盒测试,冒烟测试、回归测试

软件测试目的&#xff1a;查找软件中缺陷&#xff08;bug&#xff09;&#xff0c;保障软件质量。

IPV6公网暴露下的OPENWRT防火墙安全设置(只允许访问局域网中指定服务器指定端口其余拒绝)

首先是防火墙的常规配置和区域配置 标的有点乱但是选项含义都做了解释&#xff0c;看不懂可以直接按图抄作业。 其次是对需要访问的端口做访问放通 情况1 DDNS位于openwrt网关上&#xff0c;外网访问openwrt&#xff0c;通过端口转发访问内部服务器。此情况需要设置端口转发。 …

6-4 填充和步幅

在前面的例子 图6.2.1中&#xff0c;输入的高度和宽度都为 3 3 3&#xff0c;卷积核的高度和宽度都为 2 2 2&#xff0c;生成的输出表征的维数为 2 2 2\times 2 22。 正如我们在 6-2节中所概括的那样&#xff0c;假设输入形状为 n h n w n_{h}\times n_{w} nh​nw​&#xff…

大象机器人水星MercuryX1轮式人形机器人基于物体标记建模的键盘点按操作!

引言 在现代科技的推动下&#xff0c;机器人在日常生活和工作场景中的应用越来越广泛。本文将介绍MercuryX1&#xff0c;这款先进的机器人如何通过其手臂末端的摄像头识别并确定键盘的键位&#xff0c;从而进行精确的打字操作。通过这一案例&#xff0c;我们将展示MercuryX1在自…

xcode使用

1. 界面 1.1. Build Settings,Build Phases和Build Rules三个设置项 Build Settings(编译设置): 每个选项由标题(Title)和定义(Definition)组成。这里主要定义了Xcode在编译项目时的一些具体配置 Build Phases(编译资源):用于指定编译过程中项目所链接的原文件,依赖对象,库…

安装 electron 报错解决

1. 报错 大概率由镜像问题导致 2. 解决 2.1 打开 npm 配置 npm config edit 2.2 添加配置 registryhttps://registry.npmmirror.comelectron_mirrorhttps://cdn.npmmirror.com/binaries/electron/electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron…

Tensor安装和测试

1: 打开git官方 https://github.com/NVIDIA/TensorRT 2: 下载得到&#xff1a;TensorRT-10.2.0.19.Linux.x86_64-gnu.cuda-11.8.tar.gz 3: 下载后配置环境变量&#xff0c;上面地址记得改成真实地址。 4: 如果想python使用tensorrt&#xff0c;那么 解压后目录&#xff0c…

深入理解单元测试与JUnit:从基础概念到实践操作

文章目录 前言一、单元测试是什么&#xff1f;单元测试的特点单元测试的好处 二、junit是什么&#xff1f;三、操作步骤1.junit安装2.maven新建项目3. 新建java文件4. 生成测试类5. 编写测试方法6. 测试结果 总结 前言 随着软件开发行业的不断发展&#xff0c;测试的重要性日益…

清华和字节联合推出的视频理解大模型video-SALMONN(ICML 2024)

video-SALMONN: Speech-Enhanced Audio-Visual Large Language Models 论文信息 paper&#xff1a;https://arxiv.org/abs/2406.15704 code&#xff1a;https://github.com/bytedance/SALMONN/ AI也会「刷抖音」&#xff01;清华领衔发布短视频全模态理解新模型 | ICML 2024 …

Python数值计算(10)——PPoly对象

在scipy中&#xff0c;scipy.interpolate下还有一个PPoly的类&#xff0c;用于表示插值多项式&#xff0c;很多插值算法的结果&#xff0c;都以该类的实例返回&#xff0c;因此有必要了解该类的使用方法。要使用该类&#xff0c;首先要引入相应的模块&#xff1a; from scipy.…

基于docker的 nacos安装部署

一、拉取镜像 拉取nacos官方镜像&#xff0c;这里使用默认命令 docker pull nacos/nacos-server二、创建挂载目录 创建本地的映射文件application.properties mkdir -p /home/docker/nacos/conf /home/docker/nacos/logstouch /home/docker/nacos/conf/application.propert…

举个栗子!Tableau 技巧(280):创建点象限图( Dot Quadrant Chart )

之前分享过 &#x1f330; &#xff1a;四象限图 和 葡萄干布丁图。今天&#xff0c;我们将两者的呈现方式结合起来&#xff0c;创建如下的点象限图( Dot Quadrant Chart )&#xff0c;可以帮助数据粉在有限的看板区域内展示更多的数据信息。 那么&#xff0c;如何在 Tableau 中…

一文弄清Java的四大引用及其两大传递

开场白 Hello大家好呀&#xff0c;我是CodeCodeBond✊最近在复习很多很多的基础知识&#xff0c;有了很多新的感悟~ 话不多说&#xff0c;直接发车✈ 四大引用 问题切入点 在学习 Thread线程利用ThreadLocalMap实现线程的本地内存&#xff08;变量副本&#xff09;的时候&…

简单的docker学习 第1章 docker 概述

Docker 学习笔记 本文是b站动力节点docker学习视频的笔记整理&#xff0c;主要用于自己学习复习使用&#xff0c;视频具体地址为 : 动力节点docker 第一章 docker 概述 1.1 课程引人入 1.1.1 开发/运维互掐 ​ 开发与测试和运维间的矛盾&#xff0c;主要是由于环境的不同而…

flutter 做代码混淆

第一种、手动混淆 修改代码中出现次数多的 类目 方法 。修改静态资源的名字&#xff0c;转静态资源为webp 第二种、使用flutter 自带的命令行工具进行混淆 混淆 Dart 代码 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 使用pragma(vm:entry-point) 装饰器修改方…

【界面开发实战】使用DevEco Studio编写支付宝首页

效果展示 知识点 层叠布局 上一篇文章已经介绍了&#xff0c;这篇文章中不再赘述&#xff0c;如果想了解的话可以去看上一篇文章&#xff0c;链接如下&#xff1a; http://t.csdnimg.cn/CnBZMhttp://t.csdnimg.cn/CnBZM 弹性布局 作用&#xff1a;提供更加有效的方式对容器…