c/c++语言开发共享C++11 强类型枚举相关总结

枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用。c++98 枚举存在的缺陷: 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的。 如果在不同的枚举中定义了相同的

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

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++11 强类型枚举相关总结的详细内容,更多关于c++11 强类型枚举的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/596000.html

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐