结构体引用_C/C++结构体完全攻略

结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在过去,面向对象编程的应用尚未普及之前,程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中。一旦结构体类型被声明并且其数据成员被标识,即可创建该类型的多个变量,就像可以为同一个类创建多个对象一样。

虽然今天结构体较少使用,但知道它们是什么,以及如何使用它们仍然很重要,这并不仅仅是因为可以在较老的程序中遇到它们,还因为在某些情况下,类的实例无法使用,这时必须使用结构体。

声明结构体的方式和声明类的方式大致相同,其区别如下:

1、使用关键字 struct 而不是关键字 class。

2、尽管结构体可以包含成员函数,但它们很少这样做。所以,通常情况下结构体声明只会声明成员变量。

3、结构体声明通常不包括 public 或 private 的访问修饰符。

4、类成员默认情况是私有的,而结构体的成员则默认为 public。程序员通常希望它们保持公开,只需使用默认值即可。


以下是一个结构体声明的示例,该结构体将 5 个变量绑定在一起,保存了员工的工资单数据。这个特殊结构体的名称是 PayRoll。请注意,它以大写字母开头,这和类名使用大写字母开头的约定一样。另外还要注意,与类声明一样,在结构体声明的大括号后面必须有一个分号。

struct PayRoll
{int empNumber;string name;double hours,payRate,grossPay;
};

正如在类的对象被创建之前,类声明不会被实例化一样,结构体声明不会创建任何结构体的实例。本示例中的结构体声明只是告诉编译器PayRoll结构体看起来的样子。它本质上是创建一个名为 PayRoll 的新数据类型。

定义 PayRoll 结构体的变量和定义其他任何变量的方式并无二致,首先列出数据类型,然后是变量名称。以下定义语句创建了 PayRoll 结构体的 3 个变量:

PayRoll deptHead, foreman, associate;

它们每一个都是 PayRoll 结构体的实例,可以被分配和拥有自己的内存,以保存其成员数据。请注意,尽管 3 个结构体变量具有不同的名称,但每个变量都包含具有相同名称的成员,如图 1 所示。

6a717f7d91461ddf5106dd1e48cefd14.png

图 1 每个结构体变量都包含具有相同名称的成员

初始化结构体

当定义结构体变量时,可以通过两种方式初始化它:使用初始化列表或构造函数。

初始化列表

初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。
例如,假设已经声明了以下 Date 结构体:

struct PayRoll
{int empNumber;string name;double hours,payRate,grossPay;
};

定义和初始化 Date 变量的方式是:先指定变量名,后接赋值运算符和初始化列表,如下所示:

Date birthday = {23, 8, 1983};

该声明定义 birthday 是一个 Date 结构体的变量,大括号内的值按顺序分配给其成员。所以 birthday 的数据成员已初始化,如图 2 所示。

064a93c2cb681df6430bff9396afa8a2.png

图 2 已经初始化的 birthday 的数据成员

也可以仅初始化结构体变量的部分成员。例如,如果仅知道要存储的生日是8月23日, 但不知道年份,则可以按以下方式定义和初始化变量:

Date birthday = {23,8};

这里只有 day 和 month 成员被初始化,year 成员未初始化。但是,如果某个结构成员未被初始化,则所有跟在它后面的成员都需要保留为未初始化。使用初始化列表时,C++ 不提供跳过成员的方法。以下语句试图跳过 month 成员的初始化。这是不合法的。

Date birthday = {23,1983}; //非法

还有一点很重要,不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

因为结构体声明只声明一个结构体“看起来是什么样子的”,所以不会在内存中创建成员变量。只有通过定义该结构体类型的变量来实例化结构体,才有地方存储初始值。

构造函数初始化结构体

虽然初始化列表易于使用,但它有两个缺点:

如果有某个成员未被初始化,那么在这种情况下,跟随在该成员后面的成员都不能初始化。

如果结构体包括任何诸如字符串之类的对象,那么在许多编译器上它都将无法运行。


在这些情况下,可以使用构造函数来初始化结构体成员变量,这和初始化类成员变量是相同的。与类构造函数一样,结构体的构造函数必须是与结构体名称相同的公共成员函数,并且没有返回类型。因为默认情况下,所有结构体成员都是公开的,所以不需要使用关键字 public。
以下是一个名为 Employee 的结构体的声明语句,它包含一个具有两参数的构造函数,以便在创建一个 Employee 变量而不向其传递任何参数时,提供默认值:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

访问结构体成员

结构体成员的访问方式与类的公共成员一样,都是使用点运算符。但是,类的数据成员通常是私有的,必须通过函数访问。因为结构数据成员是公共的,所以它们可以被直接访问,并且可以像常规变量一样使用。以下语句即可为前面创建的每个 PayRoll 变量的 empNumber 成员赋值:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

以下语句将显示 deptHead 变量所有成员的内容:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

下面的程序是使用 PayRoll 结构体的完整程序。请注意,在 cin 语句、cout 语句和数学运 算中,单个结构体成员的用法和常规变量基本上是一样的。

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

程序输出结果:

Enter the employee1s number:2214
Enter the employee's name: Jack Smith
Hours worked this week: 40
Employee's hourly pay rate: 12.50Here is the employee1s payroll data:
Name:   Jack Smith
Employee number: 2214
Hours worked:   40
Hourly pay rate: 12.5
Gross pay: $500.00

程序中,变量 employee 被定义在第 17 行,它是 Payroll 结构体的一个实例。此后就可以通过变量名称和点运算符来访问其中的 5 个数据成员。例如,在第 22 行中,以下语句将读取变量的 empNumber 成员中的值:

cin >> employee.empNumber; //正确

如果试图通过结构体类型的名称来访问该成员,那么结果将是错误的:

cin >> Payroll.empNumber; //错误

结构体嵌套

正如一个类的对象可以嵌套在另一个类中一样,一个结构体的实例也可以嵌套在另一个结构体中。例如,来看以下声明:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

Costs 结构体有两个 double 类型成员,wholesale 和 retail。Item 结构体有 3 个成员,前 2 个是 partNum 和 description,它们都是 string 对象。第 3 个是 pricing,它是一个嵌套的 Costs 结构体。如果定义了一个名为 widge t的 Item 结构体,则图 3 说明了其成员。

f80aef204672f1f4a6d692d4704280df.png

图 3 在 widget 的成员中包含一个嵌套结构体

它们可以按以下方式访问:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

请注意,wholesale 和 retail 不是 widget 的成员,pricing 才是。要访问 wholesale 和 retail,必须首先访问 widget 的定价 pricing,然后由于它是一个 Costs 结构体,所以同样可以使用点运算符访问其 wholesale 和 retail 成员。

还要注意,对于所有结构体来说,访问成员时必须使用成员名称,而不是结构体名称。例如,以下语句不合法:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

在决定是否使用嵌套结构体时,请考虑各种成员的相关性。一个结构体将逻辑上属于一体的项目绑定在一起。通常,结构体的成员是描述某个对象的属性。在上述示例中,对象是一个 widget(小零部件),而 partNum(部件编号)、description(描述)、wholesale(批发)和 retail(零售)价格都是其属性。

当某些属性相关并形成对象属性的逻辑子组时,将它们绑定在一起并使用嵌套结构体是有意义的。请注意下面程序内部结构体中属性的相关性,它使用了嵌套结构体。

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

程序输出结果:

Annual costs for my 5-year-old cat Sassy are $507.00

将结构体传递给函数

与类对象一样,结构体变量也可以通过值、引用和常量引用传递给函数。默认情况下,它们通过值传递,这意味着需要生成整个原始结构的副本并传递给函数。因为不希望浪费时间来复制整个结构体,所以,除非结构很小,否则一般会通过引用将结构体传递给函数。但是,这样意味着函数可以访问原始结构的成员变量,从而可能更改它们。如果不想让函数更改任何成员变量值,那么可以考虑将结构体变量作为一个常量引用传递给函数。
下面程序定义了一个结构体变量并将其传递给了两个函数。

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

程序输出结果:

Enter the part number: 800
Enter the part description: Screwdriver
Enter the quantity on hand: 135
Enter the unit price: 1.25Part Number : 800
Description : Screwdriver
Units On Hand: 135
Price : $1.25

从函数返回一个结构体

也可以从函数返回结构体变量。在这种情况下,函数的返回类型是结构体的名称。可以改写程序 1 以允许 getItemData 函数创建 Invltem 结构体的局部实例,将数据值放入其成员变量中,然后将其传递回 main,而不是将其作为引用变量从 main 接收。
以下是修改后的 getltemData 函数的样子:

//非法结构体声明
struct Date
{int day = 23,month = 8,year = 1983;
};

以下是从 main 中调用它的方法:

part = getItemData();

注意,C++ 只允许从函数返回单个值。然而,结构体提供了解决这一限制的方法。即使一个结构体可能有几个成员,它在技术上还是一个单一的对象。通过在结构体中打包多个值,可以从函数返回任意数量的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507917.shtml

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

相关文章

python 实现 CRC 冗余码的方法

python 实现 CRC 冗余码的方法 我这里考虑输入是 torch.Tensor的一个 只包含0 ,1 元素的张量对于输入是numpy或者0,1字符串的方法就更简单了,总之都先要将输入处理成为 0,1字符串,例如“1010”首先构造一个输入&#…

mysql root密码过期了_Mac下重置mysql的root密码

php中文网最新课程每日17点准时技术干货分享我的mysql版本 MYSQL V5.7.9,旧版本请使用:UPDATE mysql.user SET PasswordPASSWORD(新密码) WHERE Userroot;Mac OS X - 重置 MySQL Root密码密码太多记不住??你是否忘记了Mac OS 的My…

论文页眉奇偶页不同怎么设置_还在愁毕业论文的页眉页脚吗?

在文档中添加页眉和页脚能够很好的对相关信息进行展示或说明,在写论文的时候,设置页眉和页脚,能够让老师清楚的了解你的论文,但同时页眉和页脚的设置也是最让人头疼的,今天零壹学长就给大家详细的介绍页眉和页脚。了解…

Acquiring lock on /*/*/.vscode-server/bin/f80445acd5a3dadef24aa20916 vscode远程linux 服务器无法建立连接

1 删除 C:\Users\‘用户名’\.ssh\ 下的 know_hosts文件 2 使用其他的ssh工具(MobaXterm)远程连接目标服务器 首先使用指令:ps -aux |grep ‘自己的用户名’ 列出自己所有的运行的程序找到正在使用报错的文件/*/*/.vscode-server/bin/f8044…

账号管理工具_全新微信个人号管理工具能选择吗?为何这么说?

点击上方“蓝字”关注我们伴随着微信营销的重要性越来越高,很多企业的新媒体运营人员也开始把注意力都放到了微信账号的运营上,不仅是公众号的发展和运营,个人号在这个过程中也是非常重要的。相对于公众号和微信群,个人号的影响力…

护理等级分级标准及巡视时间_18项护理核心制度,都在这了

一、护理质量管理制度二、病房管理制度三、抢救工作制度四、分级护理制度五、护理交接班制度六、查对制度七、给药制度八、护理查房制度九、患者健康教育制度十、护理会诊制度十一、病房消毒隔离制度十二、护理安全管理制度十三、患者身份识别制度十四、患者差错、事故报告制度…

pytorch单机多卡的正确打开方式 以及可能会遇到的问题和相应的解决方法

pytorch 单机多卡的正确打开方式 pytorch 使用单机多卡,大体上有两种方式 简单方便的 torch.nn.DataParallel(很 low,但是真的很简单很友好)使用 torch.distributed 加速并行训练(推荐,但是不友好) 首先讲一下这两种方式分别的优缺点 nn.…

2接口详解_java集合【2】——— Collection接口详解

一、Collection接口简介二、Collection源码分析三、Collection的子类以及子类的实现3.1 List extend Collection3.2 Set extend Collection3.3 Queue extend Collection四、Collection和Map的辨析五、Collection和Collections的辨析六、总结一、Collection接口简介 collection在…

幅度响应怎么计算_四电平脉冲幅度调制(PAM4)信号的误码分析

- PAM4 是一种高效利用带宽传输串行数据的方法,所需的通道带宽仅为 NRZ 所需带宽的一半。用户需要具有即时数据访问能力的互联网络,这种不断增长的需求推动着以太网、64G光纤通道、CEI-56 G以及其他新一代数据中心网络链路向前发展。用户需要具有即时数据…

使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作

使用pytorch自定义DataSet,以加载图像数据集为例,实现一些骚操作 总共分为四步 构造一个my_dataset类,继承自torch.utils.data.Dataset重写__getitem__ 和__len__ 类函数建立两个函数find_classes、has_file_allowed_extension,…

python文件和数据的格式化_Python在文本文件中格式化特定数据

谢谢你们的帮助。作为一个新手,我最终得到的代码不是那么优雅,但它仍然起作用:)。在#open the file and create the CSV after filtering the input file.def openFile(filename, keyword): #defines the function to open the file. User to…

windows功能_这 12 个好用 Windows 软件,让你也能用上 macOS 的独占功能

在离开 macOS 这段时间,每天在家依赖 Windows To Go 为生,感到日常工作流程在四处冒烟。这才发现 macOS 的有些特性就如同空气一样,虽然毫无存在感,却不可缺失。关于「如何在 Windows 中实现 macOS 的 xxx」,随便上网一…

Batch Normalization、Layer Normalization、Group Normalization、Instance Normalization原理、适用场景和实际使用经验

Batch Normalization、Layer Normalization、Group Normalization、Instance Normalization原理、适用场景和使用经验 一、 简单介绍各种Normalization 先放一张来自Group Normalization原论文中的图,个人认为这个图很形象,以此图直观感受一下各种归一…

blockly自定义中文出问题_[BlocklyNukkit入门]#5自定义物品

自定义物品创建一个木棍item blockitem.buildItem(280, 0, 1);设置名字item.setCustomName("棍");设置信息,用分号隔开换行blockitem.setItemLore(item, "第一行;第二行;第三行;第四行");添加有序合成添加有序合成,设置G为橡木原木的键,G就代表原木.参数1…

收发一体超声波测距离传感器模块_芜湖低功耗超声波液位计物位计设备排名

KUS 超声波液位物位计 8种工作状态设置指导 1), 窗口常开模式(模拟量输出产品为正线性工作模式或者距离测量模式)2), 窗口常闭模式(模拟量输出产品为负线性工作模式或者液位测量模式)3), 单点常开模4), 单点常闭模式。5), 单点常开带大滞回区间模式6), 单点常闭带大滞回区间模式…

学术写作科研工具推荐

最近在写论文,然后过程中觉得一些工具可以提升效率,所以就简单总结一下,以后也会逐渐更新 Ccf deadlines:我该赶哪个ddl呢? 一些主要ccf A、B、C类会议的截稿日期都会被统计显示在此哦,看看你想投哪个会吧…

如何加声调口诀_声母韵母口诀顺口溜歌曲(怎么快速记住声母韵母)

家有一年级的小朋友,或者是孩子即将上小学的爸爸妈妈们,孩子的拼音学习进行得怎么样了?拼音是孩子进行语文学习的第一课,也是基础。但对很多小朋友来说真的是一道拦路虎。很多孩子由于一年级拼音基础不牢,到了四五年级…

pytorch model.train() 和model.eval() 对 BN 层的影响

model.train() BN做归一化时,使用的均值和方差是当前这个Batch的如果这时 track_running_statsTrue, 则会更新running_mean 和 running_var但是,running_mean 和 running_var不用在训练阶段 model.eval() BN 做归一化时,使用的…

联想用u盘重装系统步骤_详解联想如何使用u盘重装win10系统

联想是国内知名的品牌之一,很多朋友都购买了联想品牌的电脑,但是在使用的过程中难免会出现些磕磕碰碰的问题。所以今天小编就大家详细的介绍一下联想电脑使用u盘重装win10系统的方法。联系怎么使用u盘重装win10系统呢?最近有不少朋友在询问这…

笔记本电脑键盘切换_真想本小新13pro搭档,笔记本电脑周边好物清单推荐

原标题:真想本小新13pro搭档,笔记本电脑周边好物清单推荐真想本小新13pro搭档,笔记本电脑周边好物清单推荐 2020-10-24 15:21:493点赞4收藏2评论9月28日 - 11月12日,参与#双11购物攻略#征稿活动,赢取苹果全家桶8888元超…