枚举类--强枚举

c++11增加了枚举类和枚举结构体。
旧的c++枚举类型有一个坏处是,他们将枚举成员引入周围的命名空间,导致了名称冲突

enum  eSecondCount
{
    eSecond = 1,
};
int eSecond = 3;//与枚举声明在同一个作用域

在这里插入图片描述
此外,旧的C++ enum会隐式转换为int,当我们不预期或不需要这样的转换时会导致难以察觉的错误

enum  eSecondCount 
{
    eSecond = 1,
    eMinute = eSecond * 60,
    eHour = eMinute * 60,
    eDay = eHour * 24
};

int main()
{
    eSecondCount eM = eSecondCount::eMinute;
    int m = eM;//隐式转换,m获取到值60
}

使用枚举类(又称新枚举或强枚举)时,这些问题将不再存在,
1.他们的枚举成员对枚举来说是局部的,但使用时必须加上“枚举名::
2.他们的值不会隐式转换为其他类型(比如另一个枚举或int类型),需要时可使用static_cast或(T)进行显示转换
3.可以指定枚举的类型,默认为int,下图中我指定枚举类型为char,则eDay的值为-64.枚举所占空间大小为1

enum class eSecondCount : char
{
    eSecond = 1,
    eMinute = eSecond * 60,
    eHour = eMinute * 60,
    eDay = eHour * 24
};
int main()
{
    eSecondCount eMinute = eSecondCount::eMinute;//使用时必须加上“枚举名::”
    int m = eMinute;//错误,eSecondCount类型的值不能用于初始化“int”类型的实体,不能隐式转换
    int m = static_cast<int>(eMinute);//正确,m的值为60
    int eSecond = sizeof(eSecondCount);//值为1
    cout << (int)eSecondCount::eHour;//输出-64
}

你可能感兴趣的:(c++)