原创连载,喜欢点关注。
15.结构体

15.1 什么是结构体
编程中如果有多条数据需要保存,比如说市场上各种蔬菜价格、期末考试成绩,你可以选择声明C++数组。但是使用数组有个限制——数组中的数据必须是相同的类型。如果我们想保存一组学生个人信息数据比如包含学生的姓名、年龄、身高、体重,就不能使用数组了。或许现在你认为解决这个难题,只能是给每个数据声明一个变量这一个办法了。
假如要在学生用户和学校后台之间传递全校学生的信息数据,一个一个的变量就不那么方便了。还好,C++中有一种既可以像数组一样可以保存多个数据,又可以让每个数据拥有不同类型的“数据聚合体”:C++结构体。
C++的结构体就像是一个“超级组数”,可以保存任意条不同类型的数据。像学生个人信息、多维向量、图书信息、碰撞信息等都可以用结构体表示。

15.2 定义结构体
上面所述的可以存放一组不同类型变量的新类型——结构体,在C++中不是生来就有的,而是需要程序员自己定义来告诉C++编译器学生个人信息是什么概念,包含哪些维度,用什么类型的变量来存放学生的名字、年龄、身高、体重,是小数还是整数类型还是...。
现在看来编程有点像科幻小说作家,没错,虚拟程序世界的各种概念都是由策划师设计并由程序员定义出来的。
对一个概念有了明确的表述之后(通常这个表述是符合现实生活中的逻辑的)如果想把你的意图用代码的方式告诉程序,就可以使用一些编程言语的格式来做到。
定义任何一个类型的结构体,须使用 struct 。struct 关键字是用来定义一个包含多个成员的结构体数据类型的。格式如下:
struct 类型名 {类型 成员名;类型 成员名;...}
15.3 结构体成员
1.数据成员
在结构体名称之后,包含在结构体{ }中的每一个变量称为这个结构体的数据成员。一个结构体要表达的完整信息正是由内部每一维度的成员一起构成的。
下图中定义了3个不同类型的结构体,组成结构体的每个变量成员的类型其实都是前面我们学习过的基本数据类型。

2.函数成员
C++结构体不仅可以有数据成员,还可以有函数成员。以前我们写的函数都是一个独立的,声明在main函数前面的全局函数。如果一个函数出现在结构体的{ }中,那它就是这个结构体的成员函数。
比如你想计算学生的健康指数——身高体重比,就可以在结构体中写一个内部函数。

上图中我们在学生信息结构体中定义了两个函数heightWeightRatio和printStudentBasicInfo,两个函数的实现都访问了这个结构体的数据成员,在printStudentBasicInfo函数内还使用了heightWeightRatio函数以得到身高和体重的比值并作为一条要输出的数据。
15.4 结构体对象
1.声明结构体对象
在定义了学生信息结构体之后,我们就可以创建类型为学生信息的变量了。结构体变量又可以称为结构体对象。所谓对象就是一个存储在内存中的独立的“个体”。

2.初始化结构体对象数据
声明了学生信息对象xiaohong和xiaoming之后,可以通过 变量.成员 来访问并初始化每个对象的个人信息数据了。对象之间是互相独立的,一个对象的数据包含在这个对象之内,对象和对象之间并没有共享数据(现在没有)。

3.调用结构体对象成员函数
在初始化结构体对象之后就可以调用结构体对象的函数了。如果结构体的成员函数在定义时访问了结构体的数据成员,那就要先初始化对象的数据成员然后再调用对象的函数。
4.结构体成员的访问级别
C++ 结构体中所有成员默认都是对外公开的,即public的。外界可以访问任何一个对象的成员数据或成员函数。此外你可以将结构体成员的访问级别修改为私有的,即外部不可访问。

上图中第12行的private:表示第13行开始的结构体成员外界不可访问,直到第21行的public出现,22行之后的成员才重新获得公开的访问级别。下图中红线内容是错误提示:私有的成员不可访问。

15.5 C与C++结构体的区别
C语言也有结构体,但与C++语言的结构体差异较大。
1.C的结构体内不允许有函数存在,C++允许有内部成员函数。
2.C的结构体对内部成员变量的访问权限只有一种public,而C++允许设置不同的访问权限。
3.C语言的结构体是不可以继承的,C++的结构体与C++类相似,可以从其他的结构体或者类继承过来。(什么是继承?请看后续内容)
4.在C中定义一个结构体类型要用typedef ,C++声明要简单很多。
举例:
typedef struct Color{float r;float g;float b;float a;}Color;
这里后面的Color实际上就是struct Color的别名。那么,在声明Color变量的时候可以这样写:
Color red;
但是如果没有 typedef 就必须这样写:
struct Color red;