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

2019-08-13  本文已影响0人  RC_HT

弱类型枚举(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
};

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

上一篇下一篇

猜你喜欢

热点阅读