C++ 11 枚举变量

1.枚举变量及其用法

        枚举,是C语言的一种基本类型。在C语言中,枚举列举了一组基本的变量,并穷举了所有变量。枚举变量一般用于状态或者事件的穷举。一种常用的方法是:枚举变量标注状态机的状态变化。(见我本人的博客:https://blog.csdn.net/wangzhezhilu001/article/details/107342443

      同时,枚举变量还用于标注有限的变量,防止变量出错。

2.C++ 98之前的枚举变量

      在C系列语言中,枚举变量虽然存在,但长期以来,并没有对枚举变量的错误进行限制。在如下用法中,枚举变量是长期支持的。

      

enum Color
{
    Red = 0,
    Yello, 
    Blue,
};

Color c = false; // C++ 98之前的C++编译器和传统的C编译器支持

     这是因为,在传统的C系列编译器中,并没有对枚举变量进行强制规定;所以,如果数据符合相应枚举,自然会被枚举变量接纳。而且,在C语言中枚举是 常量数值的 别名,因此会被隐式转换为整形。

     而且,在传统的C编译器和C++98编译器,枚举变量并没有被限制在作用域,这让隐式转换普遍存在。  

     这一系列问题,可能会造成如下问题,即枚举值接受一个奇怪的值,造成奇怪的错误。

3.C++11对枚举变量的改进 

     C++11为避免该错误,对枚举类型进行了更多限制。

      首先,枚举变量被进行了作用域限制。也就是说,在C++11中,枚举变量只能限制在枚举命名的作用域之内。也就是说,上面的做法,在C++11中不进行支持。

       其次,C++11增加了枚举类。在C++11中,枚举类的关键字class并不代表有任何差别。枚举类中,不能声明函数。但在C++11中,枚举类意味着:C++11把枚举作为单独的整体来进行定义。

       值得注意的是,在C++11中,枚举类的默认类型依然是整型,而不同意JAVA中默认枚举类的类型为一个class。

       提供样例代码如下:

        

#include <iostream>

using namespace std;

enum Day
{
    Sunday = 0,
    Monday,
    Tuesday,
    Thursday,
    Friday,
    Saturday,
    InvalidDay = 999,
};

enum class State: int16_t
{
    Init = 0,
    Start,
    Running,
    Pause,
    Stop,
    Exit,
    Invalid = 999,
};

std::ostream &operator << (std::ostream &os, State state)
{
    switch (state)
    {
    case State::Init:
    {
        os << "Init";
        break;
    }

    case State::Start:
    {
        os << "Start";
        break;
    }

    case State::Running:
    {
        os << "Running";
        break;
    }

    case State::Pause:
    {
        os << "Pause";
        break;
    }

    case State::Stop:
    {
        os << "Stop";
        break;
    }

    case State::Exit:
    {
        os << "Init";
        break;
    }

    default:
    {
        os << "Invalid";
        break;
    }

    }
}

int main()
{
//    Day d = 1;   //C++11中不再支持
    Day d = Day::Friday;

    cout << d << endl;

    State s;
    s = State::Running;

    cout << s << endl;

    return 0;
}

         该代码已上传到本人个人github:https://github.com/diziqian/enumTest

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值