我是靠谱客的博主 灵巧水壶,最近开发中收集的这篇文章主要介绍C++ 强枚举类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

为了解决c/c++中的enum类型的一系列缺点,比如:非强类型,允许隐式转换为int型,占用存储空间及符号性不确定。c++11引入了枚举类(又称为:强枚举类型strong-typed enum)

语法格式:

enum class 类型名 {枚举值表}; 

如:enum class People{yellow,black,white};

//这样就成功的定义了一个强类型的枚举People。

注意:等价于 enum struct 类型名{枚举值表};
(enum class中的成员没有公有私有之分,也不会使用
模板来支持泛化的功能)

3.1 强类型的枚举优点
(1)强作用域:强类型的枚举成员的名称不会被输出到其父作用域空间;
(2)转换限制:强类型枚举成员的值不可以与int隐式的相互转换。
(3)可以指定底层类型。强类型枚举底层类型为int,但是也可以显示的指定底层类型。具体方法:在enum名称后面加:“:type”,其中type可以是除wchar_t以外的任何int,如下:

enum class People:type char{yellow,black,white};
//指定了People为基于char的强枚举类型。

示例3中详细说明强枚举的特点:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

enum class Color
{
    red,
    orange,
    yellow,
    green,
    blue,
    cyan,
    purple

};

enum class Apple
{
    green = 1,
    red,
};

int main(int argc,char **argv)
{
    enum Apple apple = Apple::green;
    apple = red; //编译失败,必须使用强类型名称; ‘red’ was not declared in this scope
    if(apple == Color::red) //编译失败,必须使用Apple::red; no match for ‘operator==’ (operand types are ‘Apple’ and ‘Color’)
    {
       printf("The color of apple is red.n");
    }
    if(apple == Apple::red)	//编译通过
    {
        printf("The color of apple is red.n");
    }

    if(apple > 1)   //编译失败,无法隐式转换为int类型;error: no match for ‘operator>’ (operand types are ‘Apple’ and ‘int’)
    {
        cout<<"apple is greater than 1."<<endl;
    }
    
    if((int)apple > 1)	//编译通过,显示的类型转换
    {
        cout<<"apple is greater than 1."<<endl;
    }
    return 0;
}

4 . c++11对enum类型进行了扩展
主要有2个:
(1)对于底层的基本类型;这个参考前面的“强类型的优点(3)
(2)对于其作用域的扩展。在c++11中,枚举成员的名字除了会自动输出到父作用域,也可以在枚举类型定义的作用域内有效。

示例4:

enum Color{red,yellow,green,black,white};
enum Color color = red;
color = yellow;
color = Color::yellow;
//yello 和Color::yellow这两种形式都是合法的

5 . c++11中匿名的强类型枚举
     疑问:若在程序中,声明了一个匿名的强枚举类型,应该怎么去使用?

示例5:

#include<iostream>
using namespace std;
enum class{red,yellow,green,black,white} color;
int main(int argc,char **argv)
{
    color = red;   
    //编译失败;‘red’ was not declared in this scope
    bool value = (color == color::red); 
    //编译失败; error: ‘color’ is not a class or namespace
    return 0;
}

通过上面的示例5代码可以得知:若声明 了一个匿名的强枚举类型和示例,我们是无法对其示例进行设置值或去进行比较的,因此官方建议:在使用enum class(强枚举类型)的时候,应该总是提供一个名字。

最后

以上就是灵巧水壶为你收集整理的C++ 强枚举类型的全部内容,希望文章能够帮你解决C++ 强枚举类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部