带领域的枚举(Scoped Enumeration

目录

定义

基本语法

使用方法

枚举类的比较

枚举类的转换

枚举类的范围

枚举类的前向声明

枚举类的范围和底层类型选择

总结


定义

带领域的枚举(Scoped Enumeration)在C++中确实是一个重要的特性,它允许你创建类型安全的枚举,其中每个枚举值都是其枚举类型的一部分,并且不会隐式地转换为整数或从整数转换回来。这样做可以防止一些常见的编程错误,比如错误地假设枚举值可以直接与整数互操作。

基本语法

enum class MyEnumeration : underlying_type {  
    enumerator1,  
    enumerator2,  
    // ...  
};

其中,MyEnumeration 是枚举类型的名称,underlying_type 是枚举值的底层类型(默认为 int),而 enumerator1, enumerator2 等是枚举值的名称。

使用方法

由于带领域的枚举是强类型的,所以在使用枚举值时需要使用作用域解析运算符 :: 来指定枚举类型,如下例所示:

enum class Color : unsigned char {  
    Red,  
    Green,  
    Blue  
};  
  
void printColor(Color c) {  
    switch (c) {  
    case Color::Red:  
        std::cout << "Red" << std::endl;  
        break;  
    case Color::Green:  
        std::cout << "Green" << std::endl;  
        break;  
    case Color::Blue:  
        std::cout << "Blue" << std::endl;  
        break;  
    }  
}  
  
int main() {  
    printColor(Color::Green); // 正确使用带领域的枚举  
    // printColor(Green); // 错误:Green 没有定义  
    return 0;  
}

在这个例子中,Color 是一个带领域的枚举类型,其底层类型为 unsigned charprintColor 函数接受一个 Color 类型的参数,并使用 switch 语句来打印出对应的颜色名称。

由于 Color 是带领域的枚举,所以你不能直接写 Green(没有指定作用域),而必须写 Color::Green 来表示 GreenColor 枚举类型的一个成员。

带领域的枚举还允许你定义不同的枚举值具有不同的底层类型值,这可以通过显式地指定每个枚举值的底层类型值来实现:

enum class Day : unsigned {  
    Sunday = 1,  
    Monday,  
    Tuesday,  
    Wednesday,  
    Thursday,  
    Friday,  
    Saturday  
};

在这个例子中,Day 枚举类型的底层类型是 unsigned,而每个枚举值被赋予了特定的底层类型值。

枚举类的比较

由于带领域的枚举是强类型的,它们不能直接与整数或其他枚举类型进行比较。但是,你可以使用标准的比较运算符(如 ==, !=, <, <=, >, >=)来比较两个相同的枚举类型的值。

enum class Day : unsigned {  
    Sunday,  
    Monday,  
    Tuesday,  
    Wednesday,  
    Thursday,  
    Friday,  
    Saturday  
};  
  
int main() {  
    Day today = Day::Wednesday;  
    Day tomorrow = Day::Thursday;  
  
    if (today != tomorrow) {  
        std::cout << "Today is not tomorrow." << std::endl;  
    }  
  
    return 0;  
}

枚举类的转换

由于带领域的枚举是强类型的,它们不会自动转换为整数或其他类型。但是,你可以显式地将枚举值转换为其底层类型,或者使用 static_cast 进行转换。

enum class Day : unsigned {  
    Sunday,  
    Monday,  
    // ...  
};  
  
int main() {  
    Day today = Day::Wednesday;  
    unsigned dayNumber = static_cast<unsigned>(today); // 显式转换  
  
    std::cout << "Today is day number " << dayNumber << " of the week." << std::endl;  
  
    return 0;  
}

枚举类的范围

由于带领域的枚举是强类型的,编译器会检查枚举值的范围是否适合其底层类型。如果尝试将超出底层类型范围的值赋给枚举变量,编译器会报错。

枚举类的前向声明

在C++17及更高版本中,你可以对枚举类型进行前向声明,这允许你在完全定义枚举类型之前声明函数或类,这些函数或类使用该枚举类型。

enum class Day; // 前向声明  
  
void printDay(Day day); // 使用前向声明的枚举类型  
  
enum class Day : unsigned {  
    Sunday,  
    Monday,  
    // ...  
}; // 枚举类型的完整定义  
  
void printDay(Day day) {  
    // ...  
}

枚举类的范围和底层类型选择

选择合适的底层类型对于枚举来说很重要,因为它决定了枚举值可以占据的内存大小和可能的取值范围。通常,你应该选择一个足够小以节省内存但又能容纳所有必要枚举值的类型。例如,如果你知道你的枚举值永远不会超过255,那么 unsigned char 可能是一个好选择。如果枚举值可能需要更大的范围,那么 unsignedint 可能更合适。

总结

带领域的枚举(Scoped Enumeration)是C++中一种强大的特性,它提供了类型安全和更好的代码可读性。通过使用带领域的枚举,你可以减少因误用枚举值而导致的错误,并且能够更清晰地表达代码的意图。在设计枚举时,选择合适的底层类型和清晰的枚举值名称是很重要的,这有助于保持代码的可维护性和可读性。

  • 37
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值