枚举
C++11有作用域枚举和无作用域枚举
无作用域枚举
特点
-
全局作用域:无作用域枚举的成员(枚举值)在包含它们的作用域内是直接可见的,不需要使用枚举类型名称作为前缀。
-
隐式类型转换:无作用域枚举的成员可以隐式地转换为整数类型,这使得它们可以直接用在需要整数值的地方。
-
底层类型:在 C++98/03 中,无作用域枚举的底层类型是由编译器决定的,并且通常是足够存储所有枚举值的最小整数类型。在 C++11 及以后的版本中,可以显式指定无作用域枚举的底层类型。
有作用域枚举
特点
-
作用域限制:有作用域枚举的成员必须通过枚举类型名称访问。这样可以防止命名冲突,也更清晰地表达了代码意图。
-
强类型:与无作用域枚举不同,有作用域枚举不支持隐式转换到整数类型。这增加了类型安全性,避免了某些类型错误。
-
底层类型指定:在有作用域枚举中,可以显式地指定底层类型。这使得枚举在不同平台间具有更好的一致性和可控性。
-
前向声明:有作用域枚举支持前向声明,这意味着可以在不提供成员列表的情况下声明枚举类型。
有作用域枚举下 指定作用域
无作用域枚举易发生名称冲突
现代C++尽量用有作用域枚举
枚举项的性质
枚举项缺省用0初始化 依次递增
枚举项底层是整数值
可以用常量表达式修改枚举项的值
改变枚举项某一项 后面的项则依次递增
古老的C++代码会采用枚举的手段 定义constexpr static
指定枚举项底层类型 表明尺寸
如下 sizeof(color)打印出来将会变成1
枚举项可以隐式转换成整数类型
但是反过来整数不能转换成枚举项
如下图 编译不通过
不允许整数隐式转换成枚举的原因是容易产生歧义 导致程序错误
如下 fun(100)是写错还是真是意图 导致歧义 其次 C++有作用域枚举是强类型的
如果要用就要static_cast显示类型转换
枚举的定义与声明
无作用域枚举声明
有作用域枚举声明
有作用域枚举缺省类型是int
联合体
将多个类型合并到一起省空间
枚举与联合一起使用
匿名联合
类似于无作用域
C++11联合体定义非内建类型
C++11 引入了能够在联合体中使用非内建类型的能力,这些类型包括具有自定义构造函数、析构函数、拷贝构造函数和拷贝赋值运算符的类。
关键特性
-
构造和析构:在联合体中使用具有非平凡构造函数和析构函数的类型时,必须显式地调用这些函数。这是因为联合体不会自动调用成员的构造函数和析构函数。
-
有限的类型:虽然 C++11 允许在联合体中使用更复杂的类型,但并不是所有类型都可以用。特别是,不能在联合体中使用具有虚函数或虚基类的类型。
-
显式管理:你需要手动管理联合体中对象的生命周期,包括合适地调用构造函数和析构函数。