• C++范围枚举


            枚举类型是将一组有限的整数常量组织在一起用以描述变量可取值范围的一种数据类型。 C++中有两种类型的枚举:不限定作用域的枚举类型和限定作用域的枚举类型。限定作用域的枚举类型是 C++11 标准引入的新类型。
            
             C++11 标准引入的限定作用域的枚举类型,其定义方式如下所示:
    enum class 枚举类型名称 {枚举成员 1, 枚举成员 2, …, 枚举成员 n};
            限定作用域枚举类型是为了弥补不限定作用域枚举类型的不足而出现的,不限定作用域的枚举类型不是类型安全的,主要表现在如下几个方面:
            1. 不限定作用域的枚举类型中的枚举成员被视为整数,两种不同的枚举类型之间可以进行比较。两种不同类型的数据进行比较,可能带来数据类型转换,引起数据表示不完整。
            2. 不限定作用域枚举所使用的整数类型及其大小都由实现方法定义,皆无法明确指定。
            3. 不限定作用域枚举类型的枚举成员与枚举类型外部数据处在同一个作用域范围内,多个枚举类型不能有同名的枚举成员。
    1. //定义不限定作用域枚举类型
    2. enum color {red, yellow, green};
    3. //错误,不限定作用域枚举成员不能与其它枚举类型成员同名
    4. enum stoplight{red, yellow, green};
    5. //正确,限定作用域枚举成员的作用域限定在类型内
    6. enum class newcolor {red, yellow, green};
            相对于不限定作用域的枚举类型,限定作用域的枚举类型定义的枚举成员在枚举类型作用域外不可访问。
    1. enum color {red, yellow, green};
    2. enum class newcolor {red, yellow, green};
    3. //正确,不限定作用域的枚举类型外可以使用枚举成员
    4. color e_color = green;
    5. //错误,限定作用域的枚举成员在类型外不可访问
    6. //虽然 color 类型的 green 成员可访问,但是 color 与 newcolor 类型不同,不可赋值
    7. newcolor ec_color = green;
            在旧标准中,枚举变量可以使用整数常量进行赋值,但在 C++11 标准中,要想初始化枚举类型对象或对枚举对象赋值,必须使用该类型的一个枚举成员或该类型的一个对象。示例代码如下所示:
    1. enum color {red, yellow, green};
    2. enum class newcolor {red, yellow, green};
    3. color e_var1 = 1; //错误,1 不是枚举类型值
    4. color e_var2 = red; //正确,red 是 color 类型的枚举值
    5. color e_var3 = e_var2; //正确,同类型数据之间的赋值
    6. newcolor e_nvar1 = newcolor::red; //正确,red 是 newcolor 类型的枚举值
            不限定作用域的枚举类型对象或枚举成员可以自动转化为整型,因此可以在需要整数的地方使用它们,限定作用域的枚举类型却没有此特点。示例代码如下所示:
    1. int i = color::red; //正确,不限定作用域的枚举成员可转化为整数
    2. int j = newcolor::red; //错误,限定作用域的枚举成员不可转化为整数
            C++11 新标准除了增加了限定作用域枚举类型外,还改进了原有的不限定作用域枚举类型的定义形式:
    enum class 枚举类型名称 : 枚举常量类型 { 枚举常量 1, 枚举成员 2,…, 枚举成员 n};
    例如:
    1. enum intvalues:unsigned long long
    2. {
    3. chartype = 255, shorttype = 65535, inttype = 4295967295,
    4. longtype = 4294967295ul,
    5. longlongtype = 18446744073709551615ul
    6. };
            若不指定枚举成员类型,限定作用域枚举类型成员默认为 int,不限定作用域枚举类型成员不存在默认类型,能够确定的是成员类型足够大到能容纳所有成员。指定了枚举成员类型后,若某一枚举成员值超出了该类型所能容纳的范围,将引发错误。
  • 相关阅读:
    机器学习笔记 - 简单了解模式识别
    ChatGPT 点燃向量数据库赛道,刚刚,Zilliz Cloud 云服务重磅发布!
    sqlmap中文文档
    125.(前端)删除上传图片
    自己动手搭建一个简单的网站
    【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day13
    关于linux与android传输代码tcp -传文件
    cnn卷积神经网络反向传播,卷积神经网络维度变化
    Kubernetes 包管理 Helm Charts
    uniapp踩坑
  • 原文地址:https://blog.csdn.net/jiu_yue_ya/article/details/134274742