美文网首页
modern c++(4)-强类型枚举

modern c++(4)-强类型枚举

作者: RC_HT | 来源:发表于2019-08-13 21:05 被阅读0次

    弱类型枚举(weakly typed enum)

    一开始,由于C++的枚举类型来源于C,所以出于设计简单的目的,枚举类型只用来表示整型常量的一些名字。
    语法:

    enum Gender {
        MALE,
        FEMALE
    };
    

    这里MALE和FEMALE就是枚举值,由于枚举默认从0开始,并且后一位枚举值自动增加1,所以数值上就分别表示0和1。
    但是弱类型枚举有几个缺点,一是枚举值没有限定作用域(unscoped),就是说同一作用域下两种枚举类型的同名枚举值会产生冲突:

    enum Cup {
        SMALL
    };
    
    //重复定义SMALL,编译出错
    enum Size {
        SMALL
    };
    
    //本来显示指明Cup::SMALL或者Size::SMALL是没有歧义的,但谁让最初设定可以不带类型使用枚举值,所以还没编译到这句,定义冲突就直接over了
    Cup cup = SMALL;
    

    二是枚举值可以隐式转换为整型变量,当然这一设定也是不好的

    enum Number {
        ZERO
    };
    
    //正常编译
    int n = ZERO;
    

    强类型枚举(strongly typed enum)

    为了修复以上缺陷,C++11引入了新的强类型枚举,只需要在枚举类型名前面加上class关键字即可,和弱类型枚举类型语法不冲突:

    enum class Gender {
        MALE,
        FEMALE
    };
    
    //强类型枚举使用时必须指定属于哪一种枚举类型
    Gender gender = Gender::MALE;
    
    //转换为整型变量,必须使用显示转换
    int n = static_cast<int>(Gender::MALE);
    

    除此之外,强类型枚举还可以指定底层整型类型(若没有指定则默认为int,而弱类型枚举没有默认类型):

    enum class Gender : long {
        MALE,
        FEMALE
    };
    

    所以以后写代码还是尽量用新的强类型枚举吧。

    相关文章

      网友评论

          本文标题:modern c++(4)-强类型枚举

          本文链接:https://www.haomeiwen.com/subject/orcijctx.html