C++之C++11引入enum class与传统enum关键字总结(二百五十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++之lambda匿名函数、typedef、using等用法
2.C++11的enum class与传统的enum关键字介绍
- C++11引入的enum class关键字来定义枚举
- 传统的enum关键字定义枚举
-
作用范围:enum class创建了一个作用域限定的枚举类型,而enum则创建了一个隐式的全局作用域枚举类型。这意味着使用enum class定义的枚举成员在枚举之外是不可见的,需要通过作用域解析运算符(::)来访问。
-
默认类型安全性:enum class提供了更严格的类型安全性,不允许隐式的整数转换。它们不能与整数类型进行直接比较或赋值操作,必须使用显式的类型转换。
-
枚举成员的作用域:在enum class中定义的枚举成员在枚举之外是不可见的,因此可以使用相同名称的枚举成员在不同的枚举中进行定义。
总结:enum class提供了更严格的类型安全性和作用域隔离的特性,能够避免命名冲突和隐式类型转换的问题。而传统的enum关键字则更为灵活,但类型安全性、作用域限定方面相对较弱。
3.代码实例
1.传统enum枚举例子
v1.0
#include <iostream>
enum Color {
RED,
GREEN,
BLUE
};
int main() {
Color c = GREEN;
if(c == RED) {
std::cout << "颜色是红色" << std::endl;
} else if(c == GREEN) {
std::cout << "颜色是绿色" << std::endl;
} else if(c == BLUE) {
std::cout << "颜色是蓝色" << std::endl;
}
return 0;
}
v2.0
#include <iostream>
enum Descriptor : int32_t {
Invalid = 0,
NUM01 = 1
};
int main(){
//1.将enum class Descriptor枚举类型转换成int32_t类型
Descriptor descriptor = Descriptor::NUM01;
int32_t value = static_cast<int32_t>(descriptor);
printf("value = %d\n",value);
//2.将int32_t类型转换成enum class Descriptor枚举类型类型
int number = 23;
Descriptor desc1 = static_cast<Descriptor>(number);
printf("number = %d\n",number);
}
2.C++11引入enum class枚举例子
v1.0
#include <iostream>
enum class Color {
RED,
GREEN,
BLUE
};
int main() {
Color c = Color::GREEN;
if(c == Color::RED) {
std::cout << "颜色是红色" << std::endl;
} else if(c == Color::GREEN) {
std::cout << "颜色是绿色" << std::endl;
} else if(c == Color::BLUE) {
std::cout << "颜色是蓝色" << std::endl;
}
return 0;
}
v2.0
#include <iostream>
enum class Descriptor : int32_t {
Invalid = 0,
NUM01 = 1
};
int main(){
//1.将enum class Descriptor枚举类型转换成int32_t类型
Descriptor descriptor = Descriptor::NUM01;
int32_t value = static_cast<int32_t>(descriptor);
printf("value = %d\n",value);
//2.将int32_t类型转换成enum class Descriptor枚举类型类型
int number = 23;
Descriptor desc1 = static_cast<Descriptor>(number);
printf("number = %d\n",number);
}