C++11 强枚举类型的应用

一贯的风格,为什么c++ 11为什么要引入强枚举类型,主要是为了解决什么问题?

在此之前我们来看看平时我们的枚举用法:

enum是我们编译器内置的类型.

首先枚举类型是不安全的,为什么不安全?

//体重
namespace T {
    enum Type {
        normal,medium,height
    };
}

//商品价格
enum price{
    height = 1 ,normal = 0
};

void isHeight(T::Type t) {
    if(t == height){
        cout << "your weight is height" << endl;
    }
    else
    {
        cout << "youre weight is not height" << endl;
    }
}

我们原本是需要判断体重是否偏高? 测试时,我们是如此输入的.

int main(int argc, const char * argv[]) {
    isHeight(T::Type::medium);
    return 0;
}

输出结果如下 :
consle:
your weight is height。

我们明明输入的体重是medium,是比较正常的体重,但是判断出了高体重。

这是因为编译器在做枚举数值类型比较的时候,会被隐式的转化为int数据类型,然后再进行int数据类型进行比较.

这是一种非常不安全的比较,一般来说,编译器会进行提示,但是不会报错.

为了解决上面的问题,我们引入了强类型的枚举类型,可以帮助我们在编译截断进行类型的检测,帮助我们更好的提升我们程序的健壮性.

下面我们看看我们升级后的写法:

强类型枚举的定义:

enum class Type {normal,medium,height};

在enum后面加上class关键字,就是声明为强类型枚举类型.

在转化为强枚举类型后有下面的几个好处:

1.强枚举类型的作用域不用输出到父作用域.

怎么理解?看我们的代码:

namespace T {
    enum class Type {
        normal,medium,height
    };
    
    enum Type2 {
        normal,medium,height
    };
}

在使用的时候我们可以使用:
T::normal,T::Type2::normal这样的写法.

T::normal大家自己亲自去测试,居然是合法的。

WTF???
第一种写法:T::normald编译可以通过,那是因为枚举类型可以把自己的作用域扩张到父作用域.

但是如果使用了强枚举类型,那么作用域就会被锁定在强枚举的类型范围内,不会输出到父作用域,更加严谨.

2.在进行类型比较的时候,强枚举类型不会进行隐式的转换,编译器会进行类型的检测.

在这里插入图片描述

如果是强类型枚举类型,编译期间就不会通过,程序更加健壮了。

啊,玩意说了,C++ 11的强枚举类型,还有一个扩展的属性,就是可以指定元素的基本数据类型:

默认我们的enum type {…} 默认都是int类型的,在C++ 11中我们也可以指定为char类型.

机器型号:mac os 64位操作系统

enum class C :: char { C1,C2};
sizeof(C::C1) ; //输出1

enum class L:: unsigned long {L1,L2};
sizeof(L::L1) ;//输出8

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/85233129