C++枚举类

枚举

C++11有作用域枚举和无作用域枚举

无作用域枚举

特点

  1. 全局作用域:无作用域枚举的成员(枚举值)在包含它们的作用域内是直接可见的,不需要使用枚举类型名称作为前缀。

  2. 隐式类型转换:无作用域枚举的成员可以隐式地转换为整数类型,这使得它们可以直接用在需要整数值的地方。

  3. 底层类型:在 C++98/03 中,无作用域枚举的底层类型是由编译器决定的,并且通常是足够存储所有枚举值的最小整数类型。在 C++11 及以后的版本中,可以显式指定无作用域枚举的底层类型。

有作用域枚举

特点

  1. 作用域限制:有作用域枚举的成员必须通过枚举类型名称访问。这样可以防止命名冲突,也更清晰地表达了代码意图。

  2. 强类型:与无作用域枚举不同,有作用域枚举不支持隐式转换到整数类型。这增加了类型安全性,避免了某些类型错误。

  3. 底层类型指定:在有作用域枚举中,可以显式地指定底层类型。这使得枚举在不同平台间具有更好的一致性和可控性。

  4. 前向声明:有作用域枚举支持前向声明,这意味着可以在不提供成员列表的情况下声明枚举类型。

有作用域枚举下 指定作用域

无作用域枚举易发生名称冲突

现代C++尽量用有作用域枚举

枚举项的性质

枚举项缺省用0初始化 依次递增

枚举项底层是整数值

可以用常量表达式修改枚举项的值

改变枚举项某一项 后面的项则依次递增

古老的C++代码会采用枚举的手段 定义constexpr static

指定枚举项底层类型 表明尺寸

如下 sizeof(color)打印出来将会变成1

枚举项可以隐式转换成整数类型

但是反过来整数不能转换成枚举项

如下图 编译不通过

不允许整数隐式转换成枚举的原因是容易产生歧义 导致程序错误

如下 fun(100)是写错还是真是意图 导致歧义 其次 C++有作用域枚举是强类型的

如果要用就要static_cast显示类型转换



枚举的定义与声明

无作用域枚举声明

有作用域枚举声明 

有作用域枚举缺省类型是int

联合体

将多个类型合并到一起省空间

枚举与联合一起使用

匿名联合

类似于无作用域

C++11联合体定义非内建类型

C++11 引入了能够在联合体中使用非内建类型的能力,这些类型包括具有自定义构造函数、析构函数、拷贝构造函数和拷贝赋值运算符的类。

关键特性

  1. 构造和析构:在联合体中使用具有非平凡构造函数和析构函数的类型时,必须显式地调用这些函数。这是因为联合体不会自动调用成员的构造函数和析构函数。

  2. 有限的类型:虽然 C++11 允许在联合体中使用更复杂的类型,但并不是所有类型都可以用。特别是,不能在联合体中使用具有虚函数或虚基类的类型。

  3. 显式管理:你需要手动管理联合体中对象的生命周期,包括合适地调用构造函数和析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值