数组、枚举和结构体都属于C++中的复合数据类型,这三种数据类型必须由基本的简单类型组成,枚举和结构使用频率也很高,理解起来不难,但真正使用起来要多复杂有多复杂,不过只要理清思路,合理规划和定义,那他们就随你拿捏了。
一、枚举
当我们需要为一些可以划分为一组的数据设置可以表示他们的变量,如一周的天数,从星期一到星期天,用字符串显然太占内存,也很麻烦,于是我们用整型作为他们的标志值
int Monday = 1; int Tuesday = 2; int Wednesday = 3; int Thursday = 4; int Friday = 5; int Saturday = 6; int Sunday = 7;
这样确实挺合适的,C++也确实是这样做的,但用的是枚举
#include<iostream> using namespace std; void main() { enum Week //使用enum关键字,Day就是枚举类型,也是这一组数据的 { Monday, //这就是枚举成员,现在第一个成员为Monday,它的值就是0 Tuesday, //之后的枚举值都默认加一 Wednesday, //每个枚举值用逗号分开 Thursday, Friday, Saturday, Sunday //最后一个不用加逗号,现在Sunday的值就是6 }; //现在定义一个枚举变量,该变量需要初始化 Week myday = Week::Monday; //myday现在就是枚举成员Monday,这可以说就是int类型,但用的时候还必须要强制转型下 cout << int(myday) << endl; //输出为0 myday = Week::Sunday; //可以再次赋值 cout << int(myday) << endl; //输出为6 }
当然我们也可以自己设置枚举成员的值
enum Week //使用enum关键字,Day就是枚举类型,也是这一组数据的 { Monday = 100, //此时Monday就会是100,下面也会依次加一,即Tuesday=101,Wednesday=102 Tuesday, //101 Wednesday, //102 Thursday, //103 Friday = -10, //我们在这里又赋值了-10,从这里向后会依次加一,是的,可以赋值负数 Saturday, //-9 Sunday //-8 }; //大家可以试试自己将其中的输出出来检查
可以看出枚举中的成员本质上就是整型,但我们上面定义的myday是Week枚举类型,枚举与整型需要强制转换才可相等,使用枚举类型可以使数据更加便于管理和使用,而且可以让代码结构美观简洁。
二、结构体
#include<iostream> using namespace std; void main() { struct Postion //定义了一个位置结构体 { float x; //结构体中定义成员为位置的三维坐标 float y = 100; //可以为成员赋初值 float z; //初值默认为0 }; Postion postion; postion.x = 11.35f; //给结构体中的成员赋值 postion.y = 15.87f; postion.z = 19.21f; cout << postion.x << "," << postion.y << "," << postion.z << endl; }
当然结构体中也可以定义不同类型的成员
struct Student { int ID = 000000; char name[20]; float height; float weight; Postion selfPostion; //其他结构体也可成为其成员 }; Student student1; student1.selfPostion = postion; //将上面已设置好的位置变量赋值给其成员 //依然可以输出原来的位置值 cout << student1.selfPostion.x << "," << student1.selfPostion.y << "," << student1.selfPostion.z << endl;结构体可以说是C++中最复杂的数据类型了,他基本上不挑食,来着不惧,数组、指针、结构体等,他可以变得异常庞大,结构体中不断嵌套结构体,要是图方便不做归类,只想用结构体来调用数据,那会让阅读者眼花缭乱、头昏脑涨,所以一般结构体只是定义小规模的数据和体量小的描述对象,大型的有C++中的类去完成。
三、typedef与using
typedef与using关键字都是与我们定义数据类型相关的,我们会在今后代码中频繁地见到他们,因为他们确实让代码的可读性变得更高,也让我们可以减少重复定义相同的且很长的数据类型变量。
#include <iostream> using namespace std; int main() { //unsigned为无符号类型,其正整数范围比long大一倍,不过unsigned类型没有负数 typedef unsigned long TheLargeValue; //此时TheLargeValue就代表long关键字,算是long的别名 TheLargeValue allPopulation = 2312313232; //我们可以一眼看出这是个需要使用long或long以上定义的变量 cout << allPopulation << endl; using mylong = unsigned long; //用这种方式也可以实现上面的效果,但using的重要用途是简化复杂类型的定义 using myDefine = %^**&&((&))*&qwsdad; //后面是一段很复杂地类型定义,使用using后就可以直接用myDefine定义了 }