结构体
有的时候可能要将不同类型的数据存到同一个单元中,例如,存储一个班级的学生的姓名、学号、分数。此时数组就不能满足这种情况,因为数组要求元素的类型相同,因此此时我们需要一种特殊的数据结构——结构体。
以学生的姓名、学号、分数为例创建一个结构体:
struct Student
{
string name;
int number;
float grade;
};
第一行为申明结构体的关键字struct + 结构体名称。大括号中的为结构体的成员。
定义完结构后,就可以使用这种结构类型的变量了:
#include<iostream>
#include<string>
using namespace std;
struct Student
{
string name;
int number;
float grade;
};
int main()
{
Student student;
student.name = "张三";
stuent.number = 13;
student.grade = 80.0
return 0;
}
通过“.”运算符可以获取到各个成员并且给其赋值。
在这个例子中我们将结构体申明在main()函数前面,这种申明被称为外部申明,如果放到main()函数里面,则被称为内部申明,它们之间的区别是外部申明可以被所有函数使用,但内部申明只能被其所包含的函数使用。C++推荐使用外部申明。
结构体初始化
Student student
{
"张三",
13,
80.0
};
和数组一样,使用逗号来分割值,因此我们可以将结构体看作是可以存储不同类型的数据的特殊数组,因此我们可以将初始化写成数组初始化的形式。
Student student {"张三", 13, 80.0};
同时我们也可以在申明结构体时立即初始化:
struct Student
{
string name;
int number;
float grade;
} strudent
{
"张三",
13,
80.0
}
结构数组
在上面我们定义了学生信息的结构体,假设一个班有100个学生,每个学生的信息类型都一样,因此我们需要创建100个结构体变量来储存学生信息,这种方式显然很复杂,因此我们可以利用数组,创建一个元素类型为结构体的数组。
Student students[100];
for(int i = 0; i < 100; i++){
cin >> student.name >> student.nuber >> student.grade;
}
这样就可以将班级里的信息都储存在一起了。
枚举
枚举是一种创建粗豪常量的方式,这种方式可以替代const。
enum spectrum
{
red, orange, yellow, green, blue, violet, indigo, ultraviolet
};
上面定义好了一个叫spectrum的枚举,那么在其中的red, orange, yellow符号就被对应为数值0~7。这些常量被叫做枚举量。通过枚举,我们就不需要在程序中定义:
int main()
{
int red = 0;
int orange = 1;
...
}
枚举让程序更加简洁。
枚举变量具有一些特殊的属性,首先在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋值给这种枚举的变量,例如:
spectrum band; //创建一个枚举变量
band = orange; //有效,此时band的数值为1
band = 1; //无效,1不是枚举量,orange才是枚举量
并且,枚举变量赋值也需要注意,不能超过枚举中的整数值上界,因此band最多只能为7。
band = ultraviolet + violet; //无效,超过上界
枚举量是整型,因此可以被提升为int类型,但int类型并不能转换为枚举类型。
int color = orange; //有效
band = 3; //无效
color = 3 + orange; //有效
band = orange + red;
对于这个语句,编译器认为其是无效的,因为enum类型没有定义 + + +这个运算符。但如果定义band的类型为int,那么这个语句将被通过,此时枚举量将被强制转换为int类型。
设置枚举的值
当枚举量被定义好之后,枚举值就默认第一位为0,然后依次往后递增。但除了默认之外,枚举支持显示的创建枚举值。
enum bit
{
a = 1, b = 2, c = 3
}
或者只指定第一个枚举量的值,剩下的枚举量也是通过递增的原则赋值的。
当然也可以为每一个枚举量都指定一个枚举值。
enum bit
{
a = 3, b = 5, c = 7
}