魔法数字
在程序中出现一个毫无征兆的数字,有的时候会将其叫做魔法数字。这种行为是不太好的。
// 假如,我们定义了一种类型划分,1代表学生,2代表老师
// 我想要在程序中判断某个变量是否是学生,因此写成了
if (type == 1) // 1代表学生
{
cout << "type是学生" << endl;
}
如果只看这一段程序,会让人感觉莫名其妙,1是哪里来的?为什么要等于1呢?当然,可能你会想说,那不要紧啊,我只要在注释里写清楚1是学生不就好了吗?大家一样也看的懂的啊?
这样想是没错了。但是也还是有一些问题,例如说,假如现在1不是学生了,我们要将学生改为10,那么我们就需要将整个程序中,所有出现代表学生的1都改为10。很显然,这是很难做到的,因为,我们难以区分到底哪些1是代表学生的。
常量
为了解决这个问题,我们可以将每个需要的数字定义为const类型的值
const int student_type = 1;
const int teacher_type = 2;
这样做是一种很好的解决办法,至少我们自己不需要再使用魔法数字了。但是,现在遇到的一个问题是,我们很难要求必须要使用我们规定的const值。也就是说,即使我们规定了这样的常量,在使用的时候,有可能还是给我们扔了一个魔法数字过来。
枚举
为了让我们的程序变的更清晰,因此,有了一个新的方法,使用enum规定一个枚举类型。
#include <iostream>
using namespace std;
int main()
{
// 枚举类型通过enum定义,也必须以分号结尾
// 枚举对象的值默认从0开始,也可以手动为其设置值
// 如果手动为枚举设置了值,那么后边的成员将会依次递增
enum type{ student = 1, teacher};
// 声明一个枚举对象,可以
type s1 = student;
// 将整型隐式转换为枚举类型,不可以
// type s2 = 1;
// 将整型强制转换为枚举类型,可以
type s2 = (type)1;
// 为枚举对象赋值,不可以
// student = 2;
// 对枚举对象进行自增,不可以
// cout << student++ << endl;
// 利用枚举参与运算可以将枚举隐式转换为整型
// 将枚举提升为整型,可以
int two_student = student + student;
cout << two_student << endl;
// 打印枚举对象,可以
// 但是结果是枚举的值,不是枚举的名字
// 也就输出结果为1,不是student
cout << student << endl;
}
枚举可以没有名字
// 无名枚举
enum {student = 1, teacher };
作用域枚举(c++11)
在c++11以后,添加了一种新的枚举,叫做作用域枚举。通过enum class或者enum struct进行声明。该枚举必须使用作用域运算符::才能够使用,不能直接访问。也不再支持从枚举隐式转换为整型。
#include <iostream>
using namespace std;
int main()
{
enum class type { student = 1, teacher };
enum struct type2 { student = 1, teacher };
// 不可以!作用域枚举必须要加::作用域运算符,不再允许直接使用了
// cout << student << endl;
// 不可以!作用域枚举不再支持隐式转换为整型了
// cout << type::student << endl;
// 不可以!type和type2是两个不同的作用域枚举,根本不是一回事
// cout << (type::student == type2::student) << endl;
}
声明作用域枚举(c++20)
为了解决作用域枚举每次使用前都需要加作用域前缀的问题。在c++20中新引入了using enum。使用方法和以前的using指令一样。只需要通过using enum,就可以把作用域枚举引入了。啊这,小朋友,你是否有很多问号?
点击查看全部c++教程???????
|