IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【c++教程】2.9-枚举类型 -> 正文阅读

[Java知识库]【c++教程】2.9-枚举类型

魔法数字

在程序中出现一个毫无征兆的数字,有的时候会将其叫做魔法数字。这种行为是不太好的。

// 假如,我们定义了一种类型划分,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++教程???????

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:19:04  更:2021-09-23 11:20:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:10:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码