C++11新特性之强类型枚举及对原有类型的扩展

27 篇文章 1 订阅

C++11标准以前的枚举类型有如下缺点:

1. 非强类型,即在枚举中定义的成员会自动输出到父作用域,在枚举的父空间作用域中我们可以直接访问枚举中的某个成员而不需使用域限制符。

2.可隐式转换为int类型。

3. 占用存储空间,编译器会根据数据类型的不同对枚举类型分配不同的长度,例如在g++中,普通的枚举占用了4个字节,但如果数据长度大于四个字节,g++会将枚举类型扩展为8字节。例如下面的代码,Dbig的长度超过了四字节,编译器会将枚举类型扩展为8字节。

int main()
{
    enum D{D1=1,D2=2,Dbig=0xfffffffffLL};
    cout<<sizeof(D1)<<endl ;  //8 byte
    return 0;
}

4.符号性不确定,在vc++中会以无符号整形作为枚举的底层实现,而在g++中,会根据枚举的类型进行变动。

C++11标准中引入了一种新的枚举类型,称为强类型枚举,声明方式如下:

enum class myEnum{m1=1,m2=2};

只要在enum关键字后加上class关键字即可。

强类型枚举还允许我们指定枚举数据的底层数据类型,只要在枚举名称后加上:type就行,使用方式如下

enum class myEnum: char{m1=1,m2=2};

强类型枚举有如下特点:

1. 强作用域,枚举成员的名称不会被输出到其父作用域空间

2. 转换限制,枚举成员的值不可以被隐式地转换为整形

3. 可以指定底层类型。默认底层类型式int。


C++11对现有枚举类型进行了扩展:

1. 可以显示地指定底层类型,方法式在枚举名称后面加上 :type,如下所示:

enum myEnum: char {m1,m2,m3};

2. 枚举成员的名字除了可以自动输出到父作用域空间,也可以在枚举类型定义的作用域内有效。比如下面两种写法都是合法的:

enum myEnum{m1,m2};
myEnum e1 = m1;
myEnum e2 = myEnum::m1;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值