传统类型枚举 & 强制类型枚举

[toc]枚举Enum

0x1

0x11传统类型枚举

在传统 C++ 中,枚举类型并非类型安全,枚举类型会被视作整数,
则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给出了检查,但并非所有),
甚至枚举类型的枚举值名字不能相同,这不是我们希望看到的结果。

0x12 强制类型枚举

强制类型枚举(Strongly-type enums),是C++ 11新特性
用来解决传统C/C++枚举类型的缺陷包括
非强制类型作用域、
允许隐式转换成整型、
占用存储空间及符号的不确定性
它是一种新的枚举类型,即“枚举类”。

0x2 对比(解决问题)

枚举类型的枚举值名字不能相同
传统类型枚举 允许隐式转换成整型
枚举常量占用存储空间以及符号性不确定

0x21 枚举类型的枚举值名字不能相同

// 枚举类型的枚举值名字不能相同
// error: 'green' conflicts with a previous declaration
enum CoatColorEnum { blue, green, yellow };
enum PantsColorEnum { red, green, white };
// 使用强类型枚举
enum class CoatColorEnum { blue, green, yellow };
enum class PantsColorEnum { red, green, white };

0x22 传统类型枚举 允许隐式转换成整型

在传统类型枚举中,枚举类型会被视作整数
在强类型枚举中,不允许隐式转换成整型,只能显示转换

    enum class CoatColorEnum { value1, value2, value3 };
    enum class PantsColorEnum { value4, value5, value6 };
#if 0
    // 传统类型枚举用法
    cout << CoatColorEnum::value1 << "\t"
         << CoatColorEnum::value2 << "\t"
         << CoatColorEnum::value3 << endl;
    cout << PantsColorEnum::value4 << "\t"
         << PantsColorEnum::value5 << "\t"
         << PantsColorEnum::value6 << endl;
#endif
    // 强类型枚举用法
    cout << static_cast<int>(CoatColorEnum::value1) << "\t"
         << static_cast<int>(CoatColorEnum::value2) << "\t"
         << static_cast<int>(CoatColorEnum::value3) << endl;
    cout << static_cast<int>(PantsColorEnum::value4) << "\t"
         << static_cast<int>(PantsColorEnum::value5) << "\t"
         << static_cast<int>(PantsColorEnum::value6) << endl;
#if 0
    // 传统类型枚举用法
    if (PantsColorEnum::value5 > CoatColorEnum::value1) {
        cout << "value5 > value1" << endl;
    } else {
        cout << "value5 < value1" << endl;
    }
#endif
    // 强类型枚举用法
    if (static_cast<int>(PantsColorEnum::value5) > static_cast<int>(CoatColorEnum::value1)) {
        cout << "value5 > value1" << endl;
    } else {
        cout << "value5 < value1" << endl;
    }

0x23 枚举常量占用存储空间以及符号性不确定

枚举常量占用存储空间以及符号性不确定。
C++标准规定C++枚举所基于的“基础类型”是由编译器来具体实现
在强类型枚举中,可以指定数据类型

enum A { A1 = 1, A2 = 2, ABig = 0xFFFFFFFFU };
enum B { B1 = 1, B2 = 2, BBig = 0xFFFFFFFFFUL };

cout << sizeof(A1) << endl;  // 4	[差异点]
cout << ABig << endl;        // 4294967295
cout << sizeof(B1) << endl;  // 8
cout << BBig << endl;        // 68719476735
enum class newA:long { A1 = 1, A2 = 2, ABig = 0xFFFFFFFFU };
enum class newB:long { B1 = 1, B2 = 2, BBig = 0xFFFFFFFFFUL };

cout << sizeof(newA::A1) << endl;  // 8	[差异点]
cout << static_cast<long>(newA::ABig) << endl;        // 4294967295
cout << sizeof(newB::B1) << endl;  // 8
cout << static_cast<long>(newB::BBig) << endl;        // 68719476735
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值