医院网站建设方案详细,30秒网站,全运会为什么建设网站,网站建设环境搭建心得体会最近在看《A Tour of C 3rd》的时候发现 C 和 C 的 enum虽然使用起来比较相似#xff0c;但是目的却略有不同。关于枚举的概念还请见之前写过一篇关于 C 的那篇博客《C语言中enum#xff08;枚举#xff09;详解》#xff0c;这里不再赘述。本文侧重 C 与 C 不同的地方。
…最近在看《A Tour of C 3rd》的时候发现 C 和 C 的 enum虽然使用起来比较相似但是目的却略有不同。关于枚举的概念还请见之前写过一篇关于 C 的那篇博客《C语言中enum枚举详解》这里不再赘述。本文侧重 C 与 C 不同的地方。
首先默认情况下与 C 一样值的类型为整数所以下面样式的代码依旧可以使用
#include iostreamenum {Jan1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};int main()
{int x1 Jan;std::coutx1std::endl;
}C 不同版本的枚举使用方法也有所不同但是上面这种“plain”版本的都是一样的。所以本文不会详细介绍 C11 到 C23 每个版本的使用方法主要是介绍概念因为这个概念我花了一段时间才搞明白。 但是《A Tour of C 3rd》和《The C Programming Language》这两本书对于枚举的目的描述却不太一样。
在《The C Programming Language》中enum被描述成一种“常量列表”但是在《A Tour of C 3rd》中enum则被描述成一种用户定义类型的简单方式相比 C 的enum扩充了一些功能。
C11 添加了作用域内枚举enum class有时候枚举可能会重名这样就可以解决重名的问题了。如下
enum class Color { red, blue, green };
enum class Light { red, blue, green };要牢记enum class是一个整体含义是创建一个class一样的枚举也就是说class后面的是一个自定义的类型而大括号内的是这个“类”的域。
当我们要使用上面Color中的red时需要按照表示red所属的是哪个enum class
std::coutint(Color::red);
//OutPut0这里将Color转换成基础数据类型会发现也还是0。但是需要注意这里依旧和 C 中一样Color::red表示的是Color的red, blue, green三者中的red这个常量并不是类或结构体中的成员变量这是非常容易混淆的一点。
如果使用了enum class虽然可以赋值、初始化、比较但是就不能像 C 那样简单地输出这些枚举常量了需要将其转换成基础数据类型默认为整数或者自己写输出功能。但是我们可以用enum class创建的类型来创建新的常量
Color x Color::red;
std::coutint(x);
//OutPut0这里的x会被认为和Color::red是一类的二者可以比较如下
if (x Color::red) {std::coutx等于Color::red;
}
//x等于Color::red如果你看了我 C 的那一篇博客的话最后提到枚举的一个用途就是对比比如作为if的判断部分。所以 C 默认支持的三个功能之一就是比较。而且我们可以指定值来创建常量方法如下二者等价但是不同版本 C 可能会不同
Color x Color(10); //C11及更新版本
Color x {10}; //C17及更新版本这样x就是和Color::red是一个类型的常量二者可以互相比较但值为10。这种方法虽然变得复杂了一些但可以比较灵活地实现一些情况的判断。
书中给出了一个红绿灯的例子挺有意思的。下面我修改了一些地方不是书中的但是思路一样。
首先重载x操作符
Color operator(Color c)
{using enum Color; //这个要C20switch (c) {case red: return cblue;case blue: return cgreen;case green: return cred;}
}然后就可以通过x获取到枚举列表的下一个元素
Color x Color::red;
std::coutint(x)std::endl;
std::coutint(x)std::endl;希望能帮到有需要的人