你好,C++(14)如何描述“一个名叫陈良乔,年龄33岁,身高173厘米,体重61.5千克的男人”——3.8 用结构体类型描述复杂的事物
3.8 用结构体类型描述复杂的事物
利用C++本身所提供的基本数据类型所定义的变量,只能表达一些简单的事物。比如我们可以用int类型定义nAge变量表示人的年龄,用string类型定义strName变量表示人的姓名。然而,现实世界是复杂的,仅仅使用基本数据类型是不足以描述这个复杂的现实世界的。例如,我们无法使用某个基本数据类型来描述人这个复杂事物,因为他不仅有姓名,还有身高、年龄和性别等属性需要描述。但是我们注意到,再复杂的事物也是由简单事物组成的。既然我们能用基本数据类型来描述简单事物,那么把这些基本数据类型组合起来,形成一个可以描述同一事物多个不同属性的构造型数据类型,不就可以用来描述复杂事物了吗? 正是基于这样的想法,C++提供了结构体机制。
3.8.1 结构体的定义
在C++中,我们用struct关键字来将多个基本数据类型打包成结构体,其语法格式如下:
struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
// ...
数据类型n 成员名n;
};
其中,struct关键字表示要创建一个结构体;结构体名就是要创建的结构体的名字,通常使用结构体描述的事物作为结构体的名字。比如,我们要创建的结构体是用来描述人这个复杂事物的,那么结构体的名字就可以使用Human;在结构体定义的内部,分别使用多个不同数据类型的变量来表示复杂事物的各个属性。比如,我们可以用string类型的m_strName变量来描述人的姓名,用bool类型的m_bMale变量来描述人的性别等等。因为这些变量共同组成了结构体,所以这些变量也被称为结构体的成员变量。了解了这些,我们就可以按照如下的方式来定义表示人这个复杂事物的Human结构体:
// 定义结构体Human描述人这个复杂事物
struct Human
{
string m_strName; // 姓名
bool m_bMale; // 性别
int m_nAge; // 年龄
int m_nHeight; // 身高
float m_fWeight; // 体重
};
通过结构体将描述一个复杂事物多个属性的多个变量打包在一起之后,我们就可以用这个结构体定义变量来描述这个复杂事物:
// 定义一个Human结构体变量描述陈良乔这个人
// 这个结构体包含了他的姓名、性别和年龄等信息
Human chenlq;

图3-5 将复杂事物打包成结构体
3.8.2 结构体的使用
结构体是多个基本数据类型的组合,自然结构体变量就是结构体中多个成员变量的组合,只要有了一个结构体变量,就等同于我们同时有了多个成员变量。进而,我们可以通过“.”符号来引用一个结构体变量中各个成员变量,利用它们来描述一个复杂事物的各个属性。比如,我们可以利用上面定义的Human结构体来描述“一个名叫陈良乔,年龄33岁,身高173厘米,体重61.5千克的男人”这一复杂事物:
// 定义一个Human类型变量chenlq,
// 用来描述人这个复杂事物
Human chenlq;
// 这个人的姓名是“陈良乔”
chenlq.m_strName = "陈良乔";
// 年龄23岁
chenlq.m_nAge = ;
// 身高173
chenlq.m_nHeight = ;
// 体重61.5
chenlq.m_fWeight = 61.5;
// 男人
chenlq.m_bMale = true;
这里我们注意到,如果想用结构体变量来描述一个复杂事物,只需要用“.”符号引用这个结构体变量中的各个成员变量,然后分别将这个复杂事物的各个属性对应地赋值给成员变量就可以了。比如,我们要表示这个人的姓名是“陈良乔”,只需要将这个字符串数据赋值给“.”引出的chenlq结构体变量中表示姓名的m_strName成员变量即可。其他属性,也都可以以此类推。
这里还需要提到的是,使用“.”引用的结构体成员变量,跟直接使用一个独立变量并没有太大差别,我们可以把它当作一个普通变量一样地进行读写访问。例如:
// 对结构体中的m_strName成员变量进行读写访问
// 写访问:为成员变量赋值
chenlq.m_strName = "陈良乔";
// 读访问:输出成员变量
cout<<"这个人的姓名是:"<<chenlq.m_strName<<endl;
有了结构体机制,我们就可以描述更加复杂的事物,解决更加复杂的问题。在前面的例子中,我们曾经创建了一个数组arrSalary来保存员工的工资,如果我们希望程序同时还能够处理员工的姓名、性别、年龄等附加的人事信息。如果没有结构体的帮助,我们不得不创建多个数组来分别保存这些附加信息,代码应该是这样的:
// 定义员工数据个数
const int NUM = ;
// 定义保存姓名数据的数组
string arrName[NUM];
// 定义保存年龄数据的数组
int arrAge[NUM];
// 定义保存性别数据的数组
bool arrMale[NUM];
// 定义保存工资数据的数组
int arrSalary[NUM];
这样的代码虽然也能够解决问题,但是它有一个显著的缺点,那就是描述同一个事物的各种数据是相互分割独立的,丢失了它们之间的紧密联系。如果各个数组不是按照相同的顺序保存员工的各项数据,想要知道名字为“Chen Liangqiao”的这位员工的工资,就成了一件不可能完成的任务。
而有了结构体,我们就可以把描述同一个员工的所有相关信息,包括姓名、性别、年龄和工资等多个属性打包成一个结构体类型,然后用这个结构体类型来定义保存员工数据的数组,这样做不仅代码简单,而且上面那不可能完成的任务也可以轻松完成:
// 将描述“员工”这个复杂事物的多个属性的变量打包成一个结构体
struct Employee
{
string m_strName; // 姓名
bool m_bMale; // 性别
int m_nAge; // 年龄
int m_nSalary; // 工资
}; //… // 员工工资数据个数
const int NUM = ;
// 定义保存员工数据的数组
Employee arrEmp[NUM];
// 利用for循环结构遍历数组,找到名为“Chen Liangqiao”的员工的工资
// for循环结构参考后文4.3.3小节的介绍
for(int i = ;i < NUM; ++i)
{
// 如果数组中某个元素的m_strName成员变量的值是“Chen Liangiqoa”
if("Chen Liangqiao" == arrEmp[i].m_strName)
{
// 输出此元素的名字和工资
cout<<arrEmp[i].m_strName
<<"的工资是"<<arrEmp[i].m_nSalary<<endl;
}
}
在这段代码中,通过结构体的使用,我们将描述员工信息的多个变量打包成一个Employee结构体,然后,仅仅定义了一个Employee类型的数组,就代替了原来的四个数组,而这正体现了结构体在C++中的作用——将有联系的多个简单事物打包成单个复杂事物,实现化繁为简。
你好,C++(14)如何描述“一个名叫陈良乔,年龄33岁,身高173厘米,体重61.5千克的男人”——3.8 用结构体类型描述复杂的事物的更多相关文章
- 进程控制块PCB结构体 task_struct 描述
进程控制块,英文名(Processing Control Block),简称 PCB . 进程控制块是系统为了管理进程设置的一个专门的数据结构,主要表示进程状态. 每一个进程都对应一个PCB来维护进程 ...
- 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型
函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...
- C语言入门(14)——结构体
整数.字符.布尔值.浮点数这些数据类型都具有单一的值,这些可称为基本数据类型.但字符串是一个例外,它由很多字符组成,像这种由基本类型组成的数据类型称为复合数据类型,正如表达式和语句有组合规则一样,由基 ...
- 关于陈冰、陈良乔以及《我的第一本C++书》【转】
出处:如何在淘宝上卖出 600 本自己写的 C++ 入门书? 陈冰:<我的第一本C++书> 策划编辑,现为图灵公司副总编,<C程序设计伴侣>策划编辑 陈良乔:<我的第一本 ...
- Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...
- 10.按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package com.hanqi.test; public class People { private String name,sex; private int age; private doub ...
- 按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package java1; public class People { public String name; public int age; public String sex; public S ...
- 创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package com.chuoji; public class People { private String name; private int age; private String sex; ...
- (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
package a; public class People { private String name,sex; private int age; private double height; pu ...
随机推荐
- 海园帮忙写的JQUERY功能,实现了我们想要的,我觉得有点屌哟~~
需求就是为了可以在WEB在线更新代码期间,如果执行时间较长的话, 就在提交按钮之后,按钮变为灰色. 同时,一个DIV里每隔两秒刷新输出. 当更新完成之后(检测文档中的关键字串),按钮变为可提交状态~~ ...
- 各加密模式的演示(ECB,CBC)
对于较长的明文进行加密需要进行分块加密,但是直接加密(ecb)不容易隐藏模式,用OpenCV写了个程序论证了一下 ECB 优点就是简单,可以并行计算,不会迭代误差 缺点就是隐藏不了模式 CBC 需要初 ...
- java数据安全(一)
在java开发中,常常需要考虑数据安全问题,然不仅仅需要考虑数据存储的安全,还需要考虑数据的传输安全.自从有了数据安全问题后,密码学也就出来了.了解数据安全,首先需要了解密码学 1.什么是密码学 密码 ...
- SSH的内网穿透
SSH的内网穿透 1.内网: ssh -N -f -R 2222:127.0.0.1:22 lienzh@我的PC的IP2.外网: ssh -p 2222 root@localhost ...
- 用SQL替换最后一个指定字符后面的所有字符
下面给出任意字符串,该字符串长度未定,只知道该字符串有许多个‘-’连接起来的,现在要把最后一个‘-’后面的字符替换掉为指定串. 假如字符串为:'x1253-axebx-xcdx-o9kgl-3ddll ...
- Session之考勤
昨天初步的调侃了一下cookie,希望看官能够有更轻松愉快的学习和进一步的思考应用. 小编今天突然听到人事怨声载道,原来已多日未进行打卡考勤,虽是弹性工作,也颇有不好意思,决定明日改过,进门刷卡.灵机 ...
- 01背包之求第K优解——Bone Collector II
http://acm.hdu.edu.cn/showproblem.php?pid=2639 题目大意是,往背包里赛骨头,求第K优解,在普通01背包的基础上,增加一维空间,那么F[i,v,k]可以理解 ...
- Git详解之一 Git起步
起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...
- Linq to Sql语法及实例大全
LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的 ,而判断条件就是它后面所接的 ...
- php中使用伪静态
上次简单的说了下php中正则表达式的使用,这一次正则表达式可以派上用场了,学习伪静态需要能够很好的使用正则表达式,那么伪静态和真静态的区别是什么呢,我觉得应该是伪静态可以节约磁盘空间.利于SEO.访问 ...