c++ enum

  • 什么是枚举类型?
    如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。

  • enum与enum class的区别?(为什么需要限定作用域?)
    枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,终止枚举定义结束之处。enum与class enum区别在于是否限定其作用域。C语言规定,枚举类型(enum)的成员的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域,为此,C++11引入了枚举类(enum class)解决此问题。

enum gender{
 Girl,  
 Boy 
};
// 不能再使用一个枚举去定义Girl 和 Boy

enum student
{
 Girl,  // 错误,编译器提示 Girl,Boy重定义
 Boy 
};

原因:gender与student都处在同一作用域下,成员变量重定义。
解决方法:使用enum class能够对枚举作用域进行限定,避免枚举成员的重定义。

enum class gender
{
 Girl,  
 Boy 
};

enum class student
{
 Girl,  
 Boy 
};

int main(int argc, char *argv[])
{
 gender a = gender::Gril; 
 student b = Student::Gril;
}

注意:

  • 枚举中每个成员(标识符)结束符是“,”而不是”;” 最后一个成员可省略”,”
  • 初始化时可以赋负数,以后的标识符仍依次加1
  • 枚举变量只能取枚举说明结构中的某个标识符常量
  • 在外部可以对枚举变量进行赋值,但需要进行类型转换
  • 枚举常数可以隐式转换为int,但是int不可以隐式转换为枚举值
  • 为枚举中的每个名称分配一个整数值,该值与其在枚举中的顺序相对应。默认情况下,第一个值分配0,下一个值分配1,依次类推,但也可以显示设置枚举名称的值
  • 枚举值可以用来作判断比较。

类型转换

enum(非enum class\enum struct)会发生自动数据类型转换。

#include <iostream>
 
enum color { red, green, yellow };
 
int main() {
    //color col = 2;//ERROR , “初始化”: 无法从“int”转换为“color”
    int i = green;//发生隐式转换
    std::cout << i << std::endl;
    return 0;
}

enum class\enum struct与整形之间不会发生隐式类型转换,但是可以强转

#include <iostream>
 
enum class color { red, green, yellow};
 
int main() {
    //int res(color::red); //ERROR , “初始化”: 无法从“color”转换为“int”
    //color col(2);//ERROR , “初始化”: 无法从“int”转换为“color”
 
    //强转
    int res(static_cast<int>(color::red));//OK
    color col(static_cast<color>(1));//OK
 
    return 0;
}

指定底层数据类型(underlying type)

默认的底层数据类型是int,用户可以通过:type(冒号+类型)来指定任何整形(除了wchar_t)作为底层数据类型。

enum class color:unsigned char{red,blue};
enum class colorb:long long{yellow,black};

访问方式

  • enum定义的枚举体是一个不具有封装性(unscoped enumeration)的枚举体,成员可以在enum的大括号外被直接访问。
  • enum class或enum struct(二者在语法上是等价的)定义的枚举体是具有封装性的(scoped enumeration),成员同过成员名直接访问,而应通过域运算符来访问。
#include <iostream>
 
enum class color{red,black};
enum colorx{green,yellow};
 
int main() {
    color::red;//用域运算符访问color的成员
    green;//直接访问colorx的成员
    colorx::green;//用域运算符访问colorx的成员
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值