C++学习日记(14)—— 结构

结构这个非常长。。

我估计得分两天写(其实还是因为我自己太懒了)

结构是一种比数组更灵活的数据格式

因为一个结构可以存储多种类型的数据

结构也是C++类的基石


结构是用户定义的类型

而结构声明定义了这种类型的数据属性

定义了类型后就可以创建这种类型的变量

所以创建结构包括两步

定义结构描述,他描述并标记了能够存储在结构中的各种数据类型

然后按描述创建结构变量(结构数据对象)

举个简单的例子,以后做题会做到的学生管理系统

一般会要求这个系统有几个数据,名字、成绩、号数等

那我们就可以这么声明它

struct students

{

char name[20];

int score;

int number;

};

struct关键字点明了这是个结构的布局

标识符students是数据格式的名称

因此新类型的名称就叫做students

大括号里包含的是结构存储的类型列表

每个列表项都是一条声明语句

char\int\int三条语句

列表项我们称为这个结构体的结构成员

定义结构后,你就可以像int这些数据类型使用它

例如students peter;

省略struct这个关键字并不会出错


结构声明的位置

接着上面的声明

结构声明的位置很重要

如果你把声明的位置放在主函数里

那这个结构你就只能在主函数里用

同理,你把结构声明放在程序最开头

也就是外部声明,那你就可以被其它后面的任意函数使用

通常我们都使用外部声明

变量也可以在函数内部和外部定义

但不提倡使用外部变量

初始化的方式

students peter = {

peter,

90,

1

};

和数组一样

逗号分隔每个成员

你可以放在同一行里

最后大括号括起来

C11的标准可以省略等号

大括号空代表所有成员初始化为0

缩窄转换不被允许


结构可以将string类作为成员

前提条件是结构定义一定要访问得了std

所以你得把using语句移到定义前面

或者手动std::


其它结构属性

可以将结构作为参数传递给函数

也可以让函数返回一个结构

还可以使用赋值运算符将结构赋给另一个同类型的结构

这样结构中每个成员都将被设置为另一个结构中的值

即便这个成员是数组

可以同时完成定义结构和创建结构变量的工作

为此,只需要将变量名放在结束括号的后面即可

struct students

{

char name[20];

int score;

int number;

};peter

就像这样,你还可以加上初始化

struct students

{

char name[20];

int score;

int number;

};peter = {

peter,

90,

1

};

不过还是分开写比较方便理解

你甚至可以省略结构体的名称

可以使用成员运算符来访问它的成员

但是没必要,了解一下就好


结构数组

students grade[100];

这条语句创建了一个类型为students的数组

那这样grade的每个元素都成了结构的对象

你还可以加上成员运算符

对每个对象的某个成员数值单独修改

cin >> grade[0].name;

//输入0这个对象的名称

要记住grade是个数组,所以grade.name是无效表述

初始化依旧可以像刚刚那样

students a[2]=

{

{“peter”,90,1},

{“amy”,80,2}

};

不一定要在同一行,怎么顺手怎么来


共用体

使用关键字union

它能够存储不同的数据类型

但是只能同时存储其中的一种类型

共用体的句法和结构体相同

但是含义不同

union test

{

int a;

double b;

long c;

}

test peter;

peter.a=1;

peter有时候可以是int

有时候可以是double

一般适用于一个对象有两个数据来代表

例如商场里的商品

有的商品除了名字还有id


枚举(先了解一下)

C++的enum工具提供了另一种创建符号常量的方式

这种方式可以替代const,还允许定义新类型

使用enum的句法与使用结构相似

enum spectrum{red, orange, yellow};

这里的spectrum是一个新类型的名称

这个新类型就是我们说的枚举

就像struct变量被我们叫做结构一样

red,orange,yellow等作为符号常量

它们对应数值0~2,这些常量叫做枚举量

默认情况下都是按顺序把整数值赋值给枚举量

可以用枚举名来声明这种类型的变量

spectrum band;

在不进行强制类型转换的情况下

你只能用刚刚出现的三个枚举量来赋值给这个变量

也就是说,这个变量只有三个可能的值

你不能对枚举使用算术运算符

也就是说你不能搞啥加减乘除

强制类型转换的写法

band = spectrum(0);

括号里的数值范围是枚举量对应的0~2

在一开始可以单独设置枚举量的值

enum bits{one=1,two=2,three=3};

指定的数必须是整数,如果只定义其中一个的值

enum bits{first,second=100,third};

first依旧是0,而从second开始

后面没有被初始化的枚举量将比前面的枚举量大一

因此third的值是101

最后,可以创建多个值相同的枚举量

枚举的取值范围

刚刚提到的band,我们说它强制转换的数值范围是0~2

假如现在有这样一个枚举量

enum bits{one=1, two=2, four=4, eight=8};

bits myflag;

myflag = bits(6);

这样写是对的

因为范围是1~8

哪怕6不是枚举值也没有关系

 

发表评论

您的电子邮箱地址不会被公开。