欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++11 强类型枚举相关总结

时间:2021-05-04 10:47:17|栏目:C代码|点击:

枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用。

C++98 枚举存在的缺陷:

  • 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的。 如果在不同的枚举中定义了相同的枚举成员,则会出现重复声明(redeclaration)错误。
enum PUBLIC_COLOR { RED, YELLOW, GREEN };
enum PRIVATE_COLOR { RED, BLACK, PURPLE };  // RED 重定义
enum PUBLIC_COLOR { WHITE, GRAY };				// PUBLIC_COLOR 重定义

int main() {
 int color = RED;

 cout << color << endl;
}

你可能会想到使用命名空间来封装枚举类型,但是如果其中的某个命名空间漏写了名字则会变成匿名空间,而匿名空间中的所有枚举成员会默认变成全局命名空间下的成员。因此这种方法是不合适的。

  • 枚举中的成员被设计为常量数字的别名,因此可以隐式的转换为 int 类型,但是这在某些时候是不被期望出现的。
  • 枚举类型锁占用的空间大小以及符号不确定。

C++11 中的强枚举类型语法格式

enum class enum_name: elem_type { elem1, elem2, ... };

C++11 强枚举类型的优点

  • 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
enum class PUBLIC_COLOR { RED, GREEN, BLACK }; // ok
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 }; // ok
  • 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换。
enum class PUBLIC_COLOR { RED, GREEN, BLACK };
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };

if (PUBLIC_COLOR::GREEN == 1) {  // errror: 未定义可接受的类型转换
 cout << "color1 == 1" << endl;
}

if (PRIVATE_COLOR::PURPLE == 1) { // ok
 cout << "color2 == 1" << endl;
}
  • 可以指定底层类型。强类型枚举默认的底层类型为 int,但也可以显式地指定底层类型。
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
enum PRIVATE_COLOR: int { RED, PURPLE, PINK };

cout << sizeof(PUBLIC_COLOR::GREEN) << endl;		// 1
cout << sizeof(PRIVATE_COLOR::PURPLE) << endl;		// 4
  • 不可能对不同的枚举类型的枚举值进行比较。但相同枚举值之间如果指定的值相同,那么可以进行比较。
enum class PUBLIC_COLOR { RED, GREEN, BLACK };
enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };

if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) {  // errror
 cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl;
}

if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) {  // ok
 cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl;
}
  • 如果想要输出枚举值可以进行强制类型转换
enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
enum PRIVATE_COLOR: int { RED, PURPLE, PINK };

cout << static_cast<int>(PUBLIC_COLOR::RED) << endl;		// 0
cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl;	// 1

上一篇:c文件汇编后函数参数传递的不同之处

栏    目:C代码

下一篇:c语言中scanf的基本用法

本文标题:C++11 强类型枚举相关总结

本文地址:http://www.codeinn.net/misctech/114173.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有