首页 > 其他分享 >强类型枚举

强类型枚举

时间:2023-12-11 14:56:46浏览次数:26  
标签:int enum C++ 枚举 类型 Red

文章参考

爱编程的大丙 (subingwen.cn)

1. 枚举

1.1 概述

在C/C++中的枚举来自于C,处于设计上简单的目的,枚举往往对应到整型数值。:

// 匿名枚举
enum {Male, Female};				// 0, 1
// 有名枚举
enum Color {Red, Yellow=2, Blue};	// 0, 2, 3

枚举成员默认从0开始,随后向下递增,也可以自己为某个枚举成员指定值,而下面的枚举成员依旧是递增的。

1.2 缺陷

重定义:

在C/C++中,枚举的名字以及枚举的成员名都是全局可见的,访问时也不需要::符,而是按照全局量的方式直接访问,这就很容易导致重定义的问题。

EG:

  • 代码:

    enum China {Beijing, Dongjing};
    enum Japan {Dongjing, Daban};
    
  • 分析:此时编译会报错:Redefinition of enumerator 'Dongjing'。这时由于两个Dongjing都是全局可见的,因此发生了重定义。

隐式转换:

由于C中枚举被设计为常量数值别名的版型,所有枚举的成员都可以被隐式的转换为整形,但有时我们不想这么做。

2. 强类型枚举

C++11引入枚举类,又名强类型枚举(strong-typed enum)

定义:

// 默认底层类型为int
enum class Color {Red, Green, Blue};
// 指定类型:
enum class Color: char {Red, Green, Blue};

其中:

  • 指定的底层类型可以是除了wchar_t以外的任何整形。
    • wchar_t:双字节类型或宽字符类型,是C/C++的一种扩展的存储方式,一般为16位或32位。主要用在国际程序的实现中。

优点:

  • 强作用域:强类型枚举成员的名称不会被输出到其父级作用域空间,且必须使用有名枚举,例如:Color::Red
  • 转换类型限制:强枚举类型的值不能和整形进行隐式的转换

注意:

  • 在声明强类型枚举的时候,除了使用enum class,也可以使用enum struct,二者没有区别。
  • enum class没有共有、私有之分,也不会使用模板来支持泛化的声明。

EG:

  • 代码:

    enum class China { Shanghai, Dongjing, Beijing, Nanjing, };
    enum class Japan:char { Dongjing, Daban, Hengbin, Fudao };
    int main()
    {
        int m = Shanghai;           // error
        int n = China::Shanghai;    // error
        if ((int)China::Beijing >= 2)
        {
        	cout << "ok!" << endl;
        }
        cout << "size1: " << sizeof(China::Dongjing) << endl;
        cout << "size2: " << sizeof(Japan::Dongjing) << endl;
        return 0;
    }
    
  • 分析:

    • 第5行:错误。强类型枚举具有强作用域,必须通过枚举名::才能访问到枚举成员。
    • 第6行:错误。强类型枚举禁止枚举成员和整形进行隐式转换。
    • 第7行:正确。在将强类型枚举的枚举成员和整形进行比较之前做了强制类型转换。
    • 第11行:输出4,因为强类型枚举的地城类型值默认为int
    • 第12行:输出1,因为显式制定了该强类型枚举的类型为char

3. 对原有枚举进行扩展

强类型枚举虽然好用,但它带有浓厚的C++风格,和原有的属于C的枚举不相容。为了配合强类型枚举,C++11对原有的枚举类型进行了扩展:

  • 底层类型:可以显式指定枚举的底层类型,方式和强类型枚举一致,在枚举名称后加上:type,且type可以是除了wchar_t之外的任何整形。如果不指定,默认依旧是int类型。

    enum Colors: char{ Red, Yellow, Blue };
    

    注意:不像强类型枚举,扩展后枚举依旧支持隐式类型的转换。

    enum Colors: char{ Red, Yellow, Blue };
    int n = Colors::Red;
    
  • 作用域:C++11规定枚举成员的名字除了输出到父级作用域,还在枚举类型定义的作用域中有效:

    enum Colors: char{ Red, Yellow, Blue };
    int main(void){
        // C++11之前
        Colors c1 = Red;
        // C++11的扩展语法
        Colors c2 = Colors::Red;
        return 0;
    }
    

标签:int,enum,C++,枚举,类型,Red
From: https://www.cnblogs.com/beasts777/p/17894398.html

相关文章

  • Typescript中Unknown类型的说明&注意事项
    unknown是TypeScript中的一种顶级类型,它表示一个未知的值。与any类型不同,unknown类型更加类型安全。当一个值被标记为unknown类型时,它只能赋值给unknown或any类型。这意味着我们不能对unknown类型的值执行任何操作,除非我们首先进行类型检查或类型断言。以下是一个......
  • ts01基础类型进阶
    ......
  • MyBatis-Plus 自定义 TypeHandler 映射JSON类型为List
    1在mysql5.7支持json类型,那么在表实体是怎么运用的在mybatis-plus中有相关的handler/***Jackson实现JSON字段类型处理器**@authorhubin*@since2019-08-25*/@Slf4j@MappedTypes({Object.class})@MappedJdbcTypes(JdbcType.VARCHAR)publicclassJackso......
  • C++学习笔记五:变量与数据类型(Auto类型)
    Auto允许编译器自己来推断变量的类型,这种新功能是在c++11引入的。这个关键字结合for循环使用可以节省变量类型的重复输入。VSCode可以在鼠标移动到变量上之后直接显示变量的类型。autovar1{12};//intautovar2{13.0};//doubleautovar3{14.0f};//floatautovar4{15......
  • C++学习笔记四:变量与数据类型(布尔型)
    今天来整理一下布尔型变量的使用方法1.声明和初始化一个布尔类型的变量占据1Byte空间,数值0代表false,其他非0数值代表trueboolred_light{false};boolgreen_light{true};std::cout<<"sizeof(bool):"<<sizeof(bool)<<std::endl; 2.打印一个布尔变量std::......
  • Redis的数据类型以及使用场景,看这一篇就够啦
    Redis的数据类型以及使用场景,看这一篇就够啦原创2021-06-2018:02·猿视野Redis数据类型stringStringhashHashMaplistLinkedListsetHashSetsorted_setTreeSetredis数据存储格式redis自身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指......
  • 总线类型 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/bus.html总线类型定义请参阅结构体bus_type的内核文档。intbus_register(structbus_type*bus);声明内核中的每个总线类型(如PCI、USB等)应该声明一个此类型的静态对象。它们必须初始化name字段,并可以选......
  • SV 字符串类型
    概述常见使用方式stringb;stringb="";//拼接字符串stringa={"hi",b};//将字符串a赋值给[15:0]长度的变量r//将字符串赋值给四值逻辑logic-使用显式数据类型转换//显式数据类型转换:dst=T'(src)r=r_t'(a);//logic转变为字符串,也需要使用显式类型......
  • 锁类型及其规则 【ChatGPT】
    https://www.kernel.org/doc/html/latest/locking/locktypes.html锁类型及其规则介绍内核提供了各种锁原语,可以分为三类:睡眠锁CPU本地锁自旋锁本文概念上描述了这些锁类型,并提供了它们的嵌套规则,包括在PREEMPT_RT下的使用规则。锁类别睡眠锁睡眠锁只能在可抢占的......
  • C++学习笔记三:变量与数据类型(浮点型)
    1.数据类型与所占内存大小类型大小精度注意float47 double815默认longdouble16>double 精度就是有效数字 2.声明和初始化floatnumber1{1.12345678901234567890f};//Precision:7doublenumber2{1.12345678901234567890};......