c++枚举类型(二) c++11 枚举类

C++11 标准中引入了“枚举类”(enum class),可以较好地解决如下问题。

新的enum的作用域不在是全局的
不能隐式转换成其他类型
/**
 * @brief 上述如果 using namespace Color 后,前缀还可以省去,使得代码简化。
 * 不过,因为命名空间是可以随后被扩充内容的,所以它提供的作用域封闭性不高。
 * 在大项目中,还是有可能不同人给不同的东西起同样的枚举类型名。
 * 更“有效”的办法是用一个类或结构体来限定其作用域。
 *
 * 定义新变量的方法和上面命名空间的相同。
 * 不过这样就不用担心类在别处被修改内容。
 * 这里用结构体而非类,一是因为本身希望这些常量可以公开访问,
 * 二是因为它只包含数据没有成员函数。
 */
#include <iostream>
using namespace std;
/**
 * @brief namespace解决作用域不受限
 */
namespace Color
{
    enum Type
    {
        RED=15,
        YELLOW,
        BLUE
    };
};


struct Color1
{
    enum Type
    {
        RED=102,
        YELLOW,
        BLUE
    };
};

/**
 * @brief C++11的枚举类
 * 下面等价于enum class Color2:int
 */
enum class Color2
{
    RED=2,
    YELLOW,
    BLUE
};

enum class Color3:char;  // 前向声明


// 定义
enum class Color3:char
{
    RED='r',
    BLUE
};

int main()
{
    // 定义新的枚举变量
    Color::Type c = Color::RED;
    cout<<"c="<<c<<endl;
    /**
     * 上述的另一种方法:
     * using namespace Color; // 定义新的枚举变量
     * Type c = RED;
     */
    Color1 c1;
    cout<<c1.RED<<endl;

    Color1::Type c11 = Color1::BLUE;
    cout<<c11<<endl;

    Color2 c2 = Color2::RED;
    cout << static_cast<int>(c2) << endl;

    Color2 cc2 = Color2::BLUE;
    cout<<  "cc2="<< static_cast<int>(cc2)<<endl;



    char c4 = static_cast<char>(Color3::RED);
    cout<<c4<<endl;
    char c3 = static_cast<char>(Color3::BLUE);
    cout<<c3<<endl;
    return 0;
}
c=15
102
104
2
cc2=4
r
s
posted @ 2022-08-19 22:46  luoganttcc  阅读(26)  评论(0)    收藏  举报