[C++] enum枚举类型用法

简介: [C++] enum枚举类型用法

C ++包含许多内置数据类型。 但是对于我们想要做的事来说,这些类型有时并不够用。 因此,C ++允许程序员创建自己的数据类型。 这些数据类型称为用户定义数据类型。

也许最简单的用户定义数据类型就是枚举类型(Enumerated Types)。 枚举类型中每个可能的值都定义为符号常量(称为枚举器)。

一、为什么用枚举

在了解其语法之前,先看看枚举怎么个用途,是否有学的必要呢?其实枚举是很实用的一个工具,主要体现在代码阅读方面。

设想这样一个场景,一个项目,写了上千行,有些常量类型,只有几个固定的取值,在写的时候为了图方便,可以就用数字表示(如0,1,2,3),比如颜色,状态等。这样固然方便,且节省内存,但过了一个月再想看明白这个代码,就不容易了吧。

再退一步,拿颜色举例,有时要用上七八种颜色,如果用数字表示,对应起来也是极不方便,还得想半天,这时,如果颜色就用名字表示,但在内存中还是数字,就舒服得多了。

二、语法

1.定义

写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。

在C++中,枚举类型是通过enum关键字定义的,比如定义颜色类型:

enum Color
{
    COLOR_BLACK,
    COLOR_RED,
    COLOR_BLUE,
    COLOR_GREEN = 9,
    COLOR_WHITE,
    COLOR_CYAN,
    COLOR_YELLOW,
    COLOR_MAGENTA, 
};

括号内为该类型所有可能的取值(枚举器),以逗号分隔;大括号结尾要有分号。

注意:因为枚举类型一旦定义,枚举器就相当于全局常量,所以一般枚举器的命名要有前缀且大写,以防止和其他变量名冲突。

2.使用

Color c1(COLOR_BLACK);
Color c2 = COLOR_BLACK;
Color c3 = COLOR_YELLOW;
std::cout << c1 << endl;
std::cout << c2 << endl;
std::cout << c3 << endl;

以上代码输出0、2和12,因为默认情况下,枚举器的值依次为0,1,2…

当然也可以显式地定义各个枚举器的取值,当一个枚举器的值给定,下一个枚举器默认赋值加1。同时也可对两个枚举器给同样的取值,这时这两个枚举器是完全相同的,可以互换,仅仅名字不同。

三、其他用例

当需要表示一组特定的预定义状态时,枚举类型对于代码可读性而言非常有用。

例如,当函数内部发生错误时,函数通常将整数返回给调用方以表示错误代码。 通常,小的负数用于表示不同的可能的错误代码。例如:

int readFileContents()
{
    if (!openFile())
        return -1;
    if (!readFile())
        return -2;
    if (!parseFile())
        return -3;
    return 0; // success
}

但是,使用像这样的数字经常让人云里雾里。 一种替代方法是通过使用枚举类型:

enum ParseResult
{
    SUCCESS = 0,
    ERROR_OPENING_FILE = -1,
    ERROR_READING_FILE = -2,
    ERROR_PARSING_FILE = -3
};
ParseResult readFileContents()
{
    if (!openFile())
        return ERROR_OPENING_FILE;
    if (!readFile())
        return ERROR_READING_FILE;
    if (!parsefile())
        return ERROR_PARSING_FILE;
    return SUCCESS;
}

这比使用整数返回值更容易阅读和理解。 在使用这个函数时,也将更为方便

if (readFileContents() == SUCCESS)
{
    // do something
}
else
{
    // print error message
}

因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用,如下面的程序所示,该程序还演示了可以使用枚举的数据类型,而不实际创建该类型的任何变量。

#include <iostream>
using namespace std;
// Declare the enumerated type
enum Roster { Tom = 1, Sharon, Bill, Teresa, John };
// Sharon - John will be assigned default values 2-5.
int main()
{
    int who;
    cin >> who;
    switch (who)
    {
        case Tom :
            cout << "Tom's birthday is January 3.\n";
            break;
        case Sharon :
            cout << "Sharon's birthday is April 22.\n";
            break;
        case Bill :
            cout << "Bill's birthday is December 19.\n";
            break;
        case Teresa :
            cout << "Teresa's birthday is February 2.\n";
            break;
        case John :
            cout << "John's birthday is June 17.\n";
            break;
        default :
            cout << "Invalid selection\n";
    }
    return 0;
}

最后,再提一句,我们常用的布尔类型,其实不过是枚举类型的一个特例,枚举类型在更大程度上丰富了布尔类型的用途。

参考:https://www.cnblogs.com/ben-future/p/cpp-enum.html

目录
相关文章
|
17天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
63 0
|
2月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
35 3
【C++】map、set基本用法
|
17天前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
37 0
|
5月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
5月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
55 0
|
6月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
64 4
|
7月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
59 7
|
7月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
68 1
|
7月前
|
存储 安全 API
C++一分钟之-C++中的枚举类型(enum class)
【6月更文挑战第25天】C++的`enum class`(强类型枚举)在C++11中引入,增强了枚举的作用域和类型安全,减少命名冲突。它要求使用全名(如`Color::Green`)访问枚举成员,并能显式指定底层类型。常见问题包括默认值非0、隐式转换和范围溢出,解决办法是明确赋值、显式转换和选择合适底层类型。高效技巧包括用于状态机、作为函数参数、创建别名和迭代。掌握这些能提升代码质量。
229 0
|
8月前
|
存储 C++ 容器
C++标准库容器的基本用法
C++标准库容器的基本用法
64 0