带领域的枚举(Scoped Enumeration

2024-03-04 23:36

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

这篇关于带领域的枚举(Scoped Enumeration的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774650

相关文章

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

CCF推荐C类会议和期刊总结(计算机网络领域)

CCF推荐C类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属领域。 目录 CCF推荐C类会议和期刊总结(计算机网络领域) C类期刊 1. Ad Hoc Networks 2. CC 3. TNSM 4. IET Com

【C语言】结构体、枚举、联合体

【C语言】结构体、枚举、联合体 文章目录 @[TOC](文章目录) 前言一、结构体声明1.一般格式2.typedef 重命名结构体类型定义变量 二、结构体数组三、结构体与指针及函数传参四、结构体传参五.结构体在内存的存储六、参考文献总结 前言 使用工具: 1.编译器:VScode 2.C Primer Plus 第六版-1 提示:以下是本篇文章正文内容,下面案例可供参考

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,

10730-Antiarithmetic?【暴力枚举】

水题 求一个序列是否存在3个数按顺序构成等差数列 直接枚举等差数列的差值 时间复杂度降到 n * n / 3 开pos数组记录每个值得为之 楷vis数组记录目前i是否出现过 强行AC 15221397 10730 Antiarithmetic? Accepted C++ 0.035 2015-03-26 12:09:56 #include<cstdio>#include

PMBOK® 第六版 项目进度管理知识领域

目录 读后感—PMBOK第六版 目录 提到“进度”,大家都能直观理解其含义。有统计指出,现在项目的延迟交付比例越来越高,并且这一趋势持续上升。造成项目延期的原因是多方面的,常见的原因之一是在项目初期,由于时间充裕,往往会做一些与项目无关或超出项目范围的工作,导致项目后期不得不疯狂赶工。 另一种常见问题是过分关注单个活动的精确执行,而忽略了对整个项目进度的宏观把控,这种做法可能会导致团队失