c++ enum详解

enum 是 C++ 中的枚举类型,用于定义一组具名常量。枚举类型可以提高代码的可读性和可维护性,使得一组相关常量具有明确的命名空间和类型检查。C++ 支持两种类型的枚举:传统的枚举(enum)和强类型枚举(enum class)。

传统枚举(enum)
定义和使用
传统枚举使用关键字 enum 来定义一组具名整数常量。其基本语法如下:

enum EnumName {
    Enumerator1,
    Enumerator2,
    Enumerator3,
    // ...
};

示例

#include <iostream>

enum Color {
    RED,    // 默认情况下,枚举值从0开始,依次递增
    GREEN,
    BLUE
};

int main() {
    Color myColor = RED;
    std::cout << "myColor: " << myColor << std::endl; // 输出0
    return 0;
}

特点
枚举值默认从 0 开始,依次递增。
可以显式指定枚举值。

enum Color {
    RED = 1,
    GREEN = 3,
    BLUE = 5
};

枚举值在其命名空间中是全局的,因此不同的枚举类型中不能有相同的枚举值名称。
强类型枚举(enum class)
C++11 引入了强类型枚举(enum class),它具有更强的类型安全性和作用域控制。

定义和使用
强类型枚举使用关键字 enum class 来定义。其基本语法如下:

enum class EnumName {
    Enumerator1,
    Enumerator2,
    Enumerator3,
    // ...
};

示例

#include <iostream>

enum class Color {
    RED,
    GREEN,
    BLUE
};

int main() {
    Color myColor = Color::RED;
    // std::cout << "myColor: " << myColor << std::endl; // 错误,不能直接输出枚举类对象
    std::cout << "myColor: " << static_cast<int>(myColor) << std::endl; // 输出0
    return 0;
}

特点
枚举值在其作用域内,因此不同枚举类型可以有相同的枚举值名称。
需要显式转换才能将枚举值转换为整数类型。
默认情况下,枚举值从 0 开始,依次递增。
总结
传统枚举 vs 强类型枚举
特性 传统枚举 (enum) 强类型枚举 (enum class)
命名空间 全局命名空间 枚举类型自己的命名空间
类型安全性 较弱 强
整数转换 隐式转换 需要显式转换
可重复的枚举值名称 否 是
详细示例

#include <iostream>

enum Color {
    RED, // 0
    GREEN, // 1
    BLUE // 2
};

enum class NewColor {
    RED, // 0
    GREEN, // 1
    BLUE // 2
};

enum class TrafficLight {
    RED = 1,
    YELLOW = 2,
    GREEN = 3
};

int main() {
    // 传统枚举
    Color c = GREEN;
    std::cout << "Color GREEN value: " << c << std::endl;

    // 强类型枚举
    NewColor nc = NewColor::GREEN;
    // std::cout << "NewColor GREEN value: " << nc << std::endl; // 错误,不能直接输出
    std::cout << "NewColor GREEN value: " << static_cast<int>(nc) << std::endl;

    // 枚举类
    TrafficLight light = TrafficLight::RED;
    std::cout << "TrafficLight RED value: " << static_cast<int>(light) << std::endl;

    return 0;
}

这个例子展示了如何定义和使用传统枚举和强类型枚举,以及它们之间的主要区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值