精华内容
下载资源
问答
  • C++自定义枚举

    千次阅读 2012-10-18 22:31:13
    C++枚举类型中,枚举的名称全数暴露于一般范围中,因此两个不同的枚举可以有相同的枚举名。例如: enum Side{ Right, Left }; enum Thing{ Wrong, Right }; 编译时会产生编译错误,能一起使用。   C++...


    C++
    枚举类型中,枚举的名称全数暴露于一般范围中,因此两个不同的枚举,不可以有相同的枚举名。例如:

    enum Side{ Right, Left };

    enum Thing{ Wrong, Right };

    在编译时会产生编译错误,不能一起使用。

     

    C++11 引进了一种特别的"枚举类",可以避免上述的问题。参见我的上一篇博客《C++11》。

    但是在VC2012中尚不支持该特性。幸运的是,我们可以通过多写几行代码曲线实现一个枚举名称可重名的枚举类型。废话少话,奉上代码:

    namespace _EnumRecordType

    {

        enum E

        {

            recTypeIris,

            recTypeFace,

        };

    }

    typedef _EnumRecordType::E EnumRecordType;

     

    使用时可以像下面这样使用:

    EnumRecordType type = EnumRecordType::recTypeIris;

     

    这样实现在VC2012下可以顺利编译,但在VC2010上则会产生C4482的警告:

    warning C4482: nonstandardextension used: enum '_EnumRecordType::Enum' used in qualified name

    可以在namespace声明的前面加入如下代码,以去掉警告:

    #if defined(_MSC_VER)&& _MSC_VER < 1700

    #pragma warning(disable: 4482)

    #endif

     


    展开全文
  • C++基础之强枚举类型

    2020-12-24 10:21:53
         标准C++中,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。... 最后,枚举的名称全数暴露于一般范围中,因此C++03两个不同的枚举

         在标准C++中,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。

         C++03 唯一提供的安全机制是一个整数或一个枚举型值不能隐式转换到另一个枚举别型。 此外,枚举所使用整数类型及其大小都由实现方法定义,皆无法明确指定。

          最后,枚举的名称全数暴露于一般范围中,因此C++03两个不同的枚举,不可以有相同的枚举名。

    (好比

     enum Side{ Right, Left };
    

     enum Thing{ Wrong, Right };
    

    不能一起使用。)

    C++11 引进了一种特别的 “枚举类”,可以避免上述的问题。使用

     enum class
    

    的语法来声明:

     enum class Enumeration{ Val1, Val2, Val3 = 100, Val4 /* = 101 */,};
    

    此种枚举为类型安全的。
    枚举类型不能隐式地转换为整数 ;
    也无法与整数数值做比较。 (表示式 Enumeration::Val4 == 101会触发编译期错误)。

    #include <iostream>
    
     using namespace std;
    
     
     enum class Enumeration1
     {
    
     Val1, // 0
    
     Val2, // 1
    
     Val3 = 100,
    
     Val4 /* = 101 */
    
     };
    
     // 指定类型  !!!!!!!!!!!!!!***********!!!!!!!!!!!!!!!!!!!
    
     enum class Enumeration2:long {val1,val2=100,val3}; // val2=100.000400 出错
    
     int main(int argc, char** argv)
     {
    
     Enumeration1 my=Enumeration1::Val3;
    
     cout<<static_cast<int>(my)<<endl;
    
     cout<<static_cast<double>(Enumeration2::val2)<<endl;
    
     return 0;
    
     }
    
    展开全文
  • C++ 枚举类型enum

    2021-01-16 16:42:35
    一定的范围内取值,从确定值开始连续取值加一,若无确定值则从零开始 并且这个取值必须是枚举中的任意一个且只有一个 枚举1,枚举2相当于宏 只能简单地替换 01,属于字符串 定义枚举: enum 枚举类型{枚举1=整型...

    枚举:

    在一定的范围内取值,从确定值开始连续取值加一,若无确定值则从零开始
    并且这个取值必须是枚举中的任意一个且只有一个

    枚举1,枚举2相当于宏 只能简单地替换 01,不属于字符串
    定义枚举:

    enum 枚举类型{枚举1=整型常量值1,枚举2=整型常量值2};
    

    PS:分号不能掉

    enum sex{w,m};
    

    定义枚举变量:

    sex s=w;
    sex s1=a;//报错:必须取值为枚举中的成员(w/m),不能为其他第三方,也不能赋整型值。
    

    PS:枚举成员值从确定值开始连续取整型值,若第一个枚举成员值不给定初值默认0

    #include<iostream>
    using namespace std;
    
    enum sex{w,m};
    
    void show(sex s)
    {
    	switch(s)
    	{
    	case w:
    		cout<<"是女生"<<endl;
    		break;
    	case m:
    		cout<<"是男生"<<endl;
    		break;
    	}
    }
    int main()
    {
    	sex s;
    	show(s);
    	show(m);
    	show(w);
    	return 0;
    }
    

    enum sex{w=100,m};
    m的值是101,确定值+1,w是确定值
    enum sex{w=100,m,a=1,b,c};
    c的值是3,a+1+1
    不能取枚举类型中没有的数,报错

    展开全文
  • enum class是限定作用域枚举型别,他们仅在枚举型别内可见,且只能通过强制转换转换为其他型别。 两种枚举都支持底层型别指定,enum class默认是int,enum没有默认底层型别 enum可以前置声明,enum仅在指定默认...

    • enum现在被称为不限范围的枚举型别
    • enum class是限定作用域枚举型别,他们仅在枚举型别内可见,且只能通过强制转换转换为其他型别。
    • 两种枚举都支持底层型别指定,enum class默认是int,enum没有默认底层型别
      enum可以前置声明,enum仅在指定默认底层型别的情况下才能前置声明

      众所周知在C++中,变量名字仅仅在一个作用域内生效,出了大括号作用域,那么变量名就不再生效了。但是传统C++的enum却特殊,只要有作用域包含这个枚举类型,那么在这个作用域内这个枚举的变量名就生效了。即枚举量的名字泄露到了包含这个枚举类型的作用域内。在这个作用域内就不能有其他实体取相同的名字。所以在C++98中这个称之为不限范围的枚举型别

    enum Color{black,white,red};	//black、white、red作用域和color作用域相同
    
    auto white = false;	//错误,white已经被声明过了
    

      C++11中新增了枚举类,也称作限定作用域的枚举类

    枚举类优势——降低命名空间污染

      使用枚举类的第一个优势就是为了解决传统枚举中作用域泄露的问题。在其他地方使用枚举中的变量就要声明命名空间。

    enum class Color{black,white,red}; //black、white、red作用域仅在大括号内生效
    
    auto white = false;		//正确,这个white并不是Color中的white
    
    Color c = white;	//错误,在作用域范围内没有white这个枚举量
    
    Color c = Color::white;	//正确
    
    auto c = Color::white;	//正确
    

    枚举类优势——避免发生隐式转换

    传统的不限范围的枚举类是可以发生隐式转换的:

    enum Color{black,white,red};
    std::vector<std::size_t> primeFactors(std::size_t x);	//函数返回x的质因数
    
    Color c = red;
    
    if(c < 14.5)	//将color型别和double型别比较,发生隐式转换
    {
    	auto factors = primeFactors(c);  //计算一个color型别的质因数,发生隐式转换
    }
    

    限定作用域的枚举型别不允许发生任何隐式转换。如果非要转换,按就只能使用static_cast进行强制转换。

    enum class Color{black,white,red};
    Color c = Color::red;
    
    if(c < 14.5)	//错误,不能将枚举类和double进行比较
    {
    	auto factors = primeFactors(c); //错误,Color不能转化为size_t型别
    }
    

    枚举类优势——可以前置声明

    枚举类可以进行前置声明,即型别名字可以比其中的枚举量先声明:

    enum Color;			//错误
    enum class Color;	//正确
    

      传统的不限作用域的枚举也可以前置声明,但是需要先做其他的工作。因为一切枚举型别在C++里都需要由编译器来选择一个整型型别作为其底层型别。为了节约使用内存,编译器通常会为枚举型别选用足够表示枚举量取值的最小底层型别。但某些情况下,编译器会用空间换取时间,他们可能不选择只具备最小可容尺寸的型别(当然同时要具备优化空间的能力)。在为了使这种设计成为可能,C++98就只提供了枚举型别的定义(即列出所有的枚举量),而不支持声明。这样编译器就可能在枚举类型使用前逐个的确定其底层型别选择哪一种。

      这种前置声明的缺失会造成一些弊端。假设我们有一个枚举型别,如果我们在这个枚举中新增了一个变量,那么整个用到枚举型别的系统都会因此重新编译,哪怕整个系统只有一个函数用到了这个枚举型别中新的枚举量。而使用C++11的枚举类就可以避免:

    enum class Status;
    
    void f(Status s);
    

      若头文件包含了上述这些声明,则即使Status定义发生了修改,甚至是新增了一个枚举变量,只要这个函数中并没有使用这个新增的枚举量,就不会重新编译。

      之所以C++11中的枚举型别可以前置声明,是因为限定作用域的枚举型别底层是已知的。默认底层型别是int。如果觉得底层型别不满意,我们可以进行修改。不论是哪一种,编译器都能提前知道这个枚举量的尺寸。

    enum class Status;		//默认底层型别是int
    
    enum class Status:std::uint32_t; //修改底层型别为uint32_t
    

      C++98中的枚举类型因为编译器不知道尺寸所以不允许前置声明,如果我们和C++11中一样也提前指定底层型别,那么eunm也可以前置声明了。(枚举型别的定义也可以指定底层型别)

    enum Color:std:uint8_t;	//提前指定底层型别,可以进行前置声明
    
    enum class Status:std::uint32_t{		//在定义中设置底层型别
    	good = 0,
    	failed = 1,
    	incomplate = 100
    };
    

    C++98中enum的使用情况

      传统的enum并非被完全取代了,在一种情况下它还是具有优势,即需要引用C++11中的std::tuple型别的各个域时。

    //********文件A********//
    using UserInfo = 
    std::tuple<std::string, //名字
    			std::string //邮件
    			std::size_t>; //声望值
    
    //********文件B*******//
    UserInfo uInfo;
    
    auto val = std::get<1>(uInfo);  //取用域1的值
    

    在上述代码中,在文件B中我们要取tuple中第二个值,但是如果第一次接触这段代码,很难知道这第2个值到底是什么意思。使用不限范围的枚举型别和域序数关联就可以消除这种问题:

    eunm UserInfoFields{uiName,uiEmail,uiReputation};
    
    UserInfo uInfo;
    
    auto val = std::get<uiEmail>(uInfo);  //一目了然,要去邮件这个值
    

    以上代码能够运行的原理就是不限范围的枚举类型可以隐式转换。而使用enum class来定义的话,由于限定作用域的枚举类型不接受隐式转换,就要使用static_cast进行强转,整个代码会变得很啰嗦。当然,这种啰嗦的写法也确实能避免由于不限定作用域而带来的技术缺陷。

    展开全文
  • C++枚举类型

    2018-10-05 18:49:39
    所谓“枚举”就是把变量的值一一列出来,变量的值只能列出来的值的范围内。 声明枚举类型的一般形式: enum 枚举类型名 {枚举常量表} enum weekday {sun,mon,tue,wed,thu,fri,sat}; weekday workday,week_end;...
  • C++枚举类型enum

    千次阅读 2016-01-12 09:50:15
    实际问题中,有些变量的取值被限定一个有限的范围内。例如,一个星期内有七天,一年有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是妥当的。为此,C++语言提供了一种...
  • C++枚举类型enum与enum class

    千次阅读 2020-08-18 22:31:23
    文章目录一.关于枚举类型二.枚举类型enum的使用三.枚举类型enum class的使用 ...在C++中,枚举类型分为限定作用域(enum)和限定作用域(enum class)。 2. enum与enum class的区别? (为什么需要
  • 在C++中,枚举类型分为限定作用域(enum)和限定作用域(enum class)。 2. enum与enum class的区别? (为什么需要限定作用域?) 答:枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,终止枚举定义...
  • 一.关于枚举类型1. 什么是枚举类型?答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:...在C++中,枚举类型分为限定作用域(enum)和限定作用域(enum class)。2. enum与enum class的区别? (为...
  • 所谓”枚举”是指将变量的值一一列举出来,变量的值只能列举出来的值的范围内。声明枚举类型用enum开头。 枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合: (1)、枚举中每...
  • 众所周知的,枚举运行期才决定枚举变量的值的,而不是像宏一样预编译的时候就进行值得替换. 而且c标准规定: size(int) <= size(enum)<=系统所能表示的最大范围的值; 如: enum color{ RED = 0, ...
  • 可转换的枚举类型默认被转换为int类型,那些需要枚举类型表现为int类型的情况下,这可能会导致错误发生可转换的枚举会使得它的所有枚举其周围的代码范围内都是可见的,则可能会导致名字冲突可以指定枚举的...
  • 但这个规则有个例外 C++98风格的枚举型别受此限制。 这个例外导致一下代码会有错误: enum Color {black, white, red}; //black, white, red所在的作用域和Color相同 auto white = false; //错误!white已经...
  • 枚举的实质是有限数量的int数字集合,使用枚举的好处就是“望文生义”而又影响效率,类似常量宏但又在C++的强类型检查范围内。 基本上教科书上都会有类似的示例: enum Number { one = 1, two, three, ...
  • 现有的C++中有枚举类型,关键字为enum,然则它会存在三个问题: 1. 那些需要枚举类型表现为int类型时,它却默认表现为int类型,这会导致错误发生。 2. 可转换的枚举会使得他的枚举其周围的代码范围内都...
  • 前言枚举(enum)类型是计算机编程语言中的一种数据类型。枚举类型:实际问题中,有些变量的...枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值能超过定义的范围。应该说明的是,...
  • 枚举就是根据提出的问题,列出该问题所有可能的解,并逐一列出的过程中,检验每个可能的解是否是问题真正的解,如果是就采纳这个解,如果不是就判断下一个。 枚举的题目特点:解枚举范围是有穷的,检验条件是...
  • C++11 理解 (十二) 之 强类型枚举

    千次阅读 2013-08-23 11:03:00
    标准C++中,枚举类型不是类型安全的。枚举类型被视为整数,这使得两种不同的枚举类型之间可以进行比较。C++03 唯一提供的安全机制是一个整数或一个枚举型值能隐式转换到另一个枚举别型。 此外,枚举所使用整数...
  • 小明对数位中含有 2、0、1、9 的数字很感兴趣(包括前导 0), 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问, 1到 n中,所有这样的数的和是多少? 输入格式 共一行...
  • 枚举

    2008-09-06 22:19:00
    如果在代码的某个地方,要试图把一个不在可接受范围内的值赋予枚举的一个实例,编译器就会报告一个错误。这个概念对于VB程序员来说是新的。C++支持枚举,但C#枚举要比C++枚举强大得多。从长远来看,创建枚举可以节省...
  • 枚举类型 实际问题中,有些变量的取值被限定一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是妥当的。为此,C语言...
  • 联合与枚举很多小伙伴老是搞混了,这次记下来,与大家分享,希望大家能够有所收获。 enum是枚举型 ...枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值能超过定义的范围..
  • C++11 面向对象系列 ...我们编程时有时想让一个变量的值只规定范围里取值,那么就会考虑使用enum类型。C++11之前的enum类型是继承C的: enumcolor{RED,GREEN,BLUE,BLACK}; 然后我们再...
  • 二进制枚举

    2020-10-09 13:07:02
    二进制枚举 ACM中二进制枚举C++1秒大约能枚举22位, for循环能跑太多, 加上子层循环和判断,所以一般范围大概...二进制枚举范围为0到2^n - 1。 例题 import java.util.Scanner; public class Main { // 15个
  • enum枚举介绍

    千次阅读 2012-05-30 00:18:31
    C/C++程序语言中的一种数据类型  枚举类型实际问题中,有些变量的取值被...枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值能超过定义的范围。应该说明的是,枚举类型是一种基本

空空如也

空空如也

1 2 3 4 5 6
收藏数 115
精华内容 46
关键字:

沙箱安全机制