C++11 enum class

/*
整形提升的关键:
* 1.一个char类型、short类型、位域(不论是有符号还是无符号)或是一个枚举体,都可以在int或是unsigned int可以使用的表达式中使用。
* 2. 换句话就是上述的类型可以替换表达式中的int或是unsigned int
*/

#include "../common.h"

int add(int addA,int addB)
{
    return addA + addB;
}

/*无法限定作用域,可能会导致冲突*/
enum Test
{
    e_a,
    e_b,
    e_c,
};


class CTest
{
    private:
    public:
        enum _enum
        {
          eC_a,
          eC_b,
          eC_c,  
        };
};


/*
    C++11 枚举类
*/
enum class test
{
    ec_a,
    ec_b,
    ec_c,

};

/* 枚举类定义基础类型*/
enum class test2:int
{
   ec_a,
   ec_b,
   ec_c,
};

enum class test3:char
{
   ec_a,
   ec_b,
   ec_c,
};
int main()
{
    char c_a = 1,c_b = 1;
    /*整形提升*/
    printf("c_add:%d\n",add(c_a,c_b)); // 2 = 1 + 1

    /*普通枚举,可整形提升,可随意访问*/
    printf("e_add:%d(e_a,e_c)\n",add(e_a,e_c)); // 2 = 0 + 2

    /*类里面定义枚举,无法直接访问,可以整形提升*/
    //printf("eC_a:%d\n",eC_a);
    printf("eC_a:%d eC_add\n",add(CTest::_enum::eC_a,CTest::_enum::eC_b));//编译没有警告

    /*C++11枚举类,无法直接访问,不能整形提升*/
    //printf("ec_add:%d\n",add(ec_a,ec_c));  //编译报错,无法直接访问ec_a,ec_c
    printf("%d\n",test::ec_b); //编译会有警告,因为%d类型是test而非int
    //printf("ec_add:%d\n",add(test::ec_a,test::ec_c)); //编译报错,无法当作int使用
    
    test2 t_a;
    test3 t_b;
    printf("%d\n",test2::ec_b); //
    printf("size2:%lu  size3:%lu\n",sizeof(t_a),sizeof(t_b));
    printf("ec_add:%d\n",add((int)test2::ec_a,(int)test2::ec_c)); //强转为int


    t_a = test2::ec_a;
    /*if(t_a == 1)  //会报错
    {

    }*/

    Test e_ta;
    if(e_ta == 0)//会成功,所以用普通的枚举会有一定危险
    {
        printf("It's true...\n");
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值