`
jiapumin
  • 浏览: 345402 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于C++中enum的探讨

    博客分类:
  • c++
阅读更多
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。

举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!

enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。

  这里要说一下,如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!

enum box{pencil,pen};

enum box box2;//或者简写成box box2;

  再有一种就是在声明的时候同时定义。

enum {pencil,pen}box,box2; //在声明的同时进行定义!

  枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!

enum box{pencil=1,pen=2};

但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作,例如

enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!

  前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习!

#include <iostream>
using namespace std;

void main(void)
{
    enum egg {a,b,c};
    enum egg test; //在这里你可以简写成egg test;

     test = c; //对枚举变量test进行赋予元素操作,这里之所以叫赋元素操作不叫赋值操作就是为了让大家明白枚举变量是不能直接赋予算数值的,例如(test=1;)这样的操作都是不被编译器所接受的,正确的方式是先进行强制类型转换例如(test = (enum egg) 0;)!

    if (test==c)
     {
        cout <<"枚举变量判断:test枚举对应的枚举元素是c" << endl;
     }

    if (test==2)
     {
        cout <<"枚举变量判断:test枚举元素的值是2" << endl;
     }

    cout << a << "|" << b << "|" << test <<endl;

    test = (enum egg) 0; //强制类型转换
    cout << "枚举变量test值改变为:" << test <<endl;
    cin.get();
}

  看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自动提升为算术类型的!

#include <iostream>
using namespace std;

void main(void)
{
    enum test {a,b};
    int c=1+b; //自动提升为算术类型
    cout << c <<endl;
    cin.get();
}

enum是用户自定义类型,他有数据成员,还有成员函数!
For example:
enum e{a=1 , b=2 , c=4};
那么:
001: enum e e1;        //enum e不是对象,它是类型,e1才是类型enum的对象!
002: e e1;             //e是类型enum e的简写哦!

003: e1 = 1;              //绝对的错误!int怎能赋值给一个用户自定义类型
004: e1 = e();          //e()? 对呀,你没看错,默认构造函数
005: e1 = e(1)           //e(int)? 嘿嘿,这才是从int构造enum e类型对象的构造函数
006:e1 = a;              //哈哈,默认调用“拷贝构造函数”···虽然有点不完备

大胆的想:enum会不会有用户自定义成员函数呢?呵呵,我是没有实验出来。要不,你自己试试?
感想:C++虽然是初期的OO语言,但是类型化的概念已经深入到了语言本身。面对一门OO语言,你要必须知道一件事:一切都是对象,一切都有类型···

enum的“取值范围”和“内存分配”

先纠正一个常见错误,很多人认为enum是个离散量集合,太理想化了^_^,简单思考一下就破了,不多说,入正题:
如何确定一个enum的取值范围?
For example:
         enum e1{ a=2, b=4 };

首先找到其绝对值的最大值,但为了容易理解,我先不谈负数,也就是先找到其最大值,这里的最大值是4。
4 用二进制表示就是 100,也就是需要3bits才能最小的容纳下4这个值,而3bits所能表示的范围是 0-7,于是e1的取值范围为[0,7]。

现在来看看负数,
         enum e2{ a=-2, b=4 };
其中绝对值最大的是4,需要3bits才能容纳下,但因为可以取负值(而最大元素b=4不是负值),也就是说需要增加一个符号位,那么就需要4bits。
4bits的取值范围是 1000 - 0111(二进制表示),也就是 -8 到 7(十进制表示)。
enum e3{ a=-4, b=2 } 就只需要3bits,取值范围是[-4,3]。


简单的说就是找到最少的能容纳下所有的元素的位数
为什么要获取enum的取值范围?因为C++标准规定超出枚举类型表示范围的赋值结果是undefined的。
也就是说 e2 x = (e2)6 是肯定正确的,而 e2 y = (e2)8 行为是未定义的。
undefined的含义我就不多说了,想怎么去歪解就怎么去歪解^_^

enum的内存分配呢?
比如 e2 需要3bits,那么C++规定e2的尺寸只要容得下3bits就行,到底是取1个byte,还是4个byte,还是...,那由编译器自己决定。但是,C++标准在这里有个限制:1<= sizeof(enmu)<=sizeof(int)。嘿嘿。
转自:http://hi.baidu.com/wy_51131/blog/item/7251e7cf45d38d0592457e87.html#0
分享到:
评论

相关推荐

    C++ 中 enum class 与 enum 的全面解析与对比

    本文深入探讨了 C++ 中enum class(强类型枚举)和传统enum(普通枚举)的特性、用法、区别以及各自的适用场景。通过详细的代码示例、语法分析和实际应用案例,帮助读者全面理解这两种枚举类型在类型安全性、作用域...

    解析C++CLI中的继承与枚举

    C++CLI引入了一种新的枚举类型,即`enum class`,它与标准C++中的`enum`有所不同。在例1中,我们看到了一个名为`TransactionType`的`enum class`,它基于`unsigned char`并包含了`Deposit`、`Withdrawal`和`Transfer...

    Effective C++ 中文带目录

    本书不仅深入探讨了C++语言的高级特性,也提出了一系列编程实践中的最佳实践和技巧。侯捷老师翻译的中文版,使更多的中文读者能够学习和掌握C++编程的精髓。由于本书是系列书籍的一部分,其内容广泛且详尽,涵盖了从...

    用c++写的 log 日志文件

    本文将深入探讨如何使用C++来编写一个基础的日志系统,以便将日志信息写入文件。 首先,让我们理解日志的基本概念。日志是一个记录程序运行过程中的事件、错误、警告和其他相关信息的文件。这些信息对于理解和解决...

    C++基础知识总结

    本文档介绍了 C++ 中关于数据类型和变量作用域的基础知识,包括内置数据类型、枚举类型、变量定义等概念。这些基础知识对于理解 C++ 程序设计至关重要,也是进一步学习面向对象编程的基础。接下来的部分将更深入地...

    C++ Primer(Fifth Edition)(英文版+中文版)

    最后,第五版还涉及了C++11和C++14的新特性,如lambda表达式、右值引用、auto关键字、强类型枚举(enum class)、统一初始化等,这些现代C++特性极大地提升了代码的简洁性和可读性。 总之,《C++ Primer (Fifth ...

    C++ primer自学资源共享

    枚举在C++中可以省略`enum`关键字,并且枚举变量只能接受枚举值,增强了类型安全性。C++内置了`bool`类型,支持`true`和`false`两个值。在布尔运算中,`bool`可以与其他类型相互转换,例如`true`对应1,`false`对应0...

    王桂林老师 c++基础与提高

    接下来,他探讨了C++的应用领域,包括系统层软件开发、服务器程序开发、游戏、网络、分布式系统、云计算以及科学计算等领域。这帮助学习者了解C++的广泛适用性。 在C++的基础知识点部分,王老师详细讲解了C++对...

    c++经典代码大全 清晰版

    9. **C++11及后续版本新特性**: 自C++11开始,C++引入了许多新特性,如右值引用、lambda表达式、auto类型推断、范围for循环、强类型enum等,这些都在逐步改变C++的编程风格,使其更现代化、更安全。 10. **设计模式...

    Effective C++ 中文 chm

    7. **设计模式**:书中介绍了如工厂方法、单例模式、观察者模式等设计模式在C++中的应用,以及如何利用C++的特性实现这些模式,以提高代码的可扩展性和可维护性。 8. **STL(Standard Template Library)**:STL是...

    C++应用编程200例.rar

    枚举(enum)是C++中另一种有用的类型,它用于定义一组相关的命名常量。枚举可以提升代码的可读性,避免硬编码数值,并提供类型安全。在C++11之后,枚举有更强的功能,例如可以定义枚举类,提供更严格的类型检查。...

    enum类型的本质[文].pdf

    在C++中,enum类型进一步发展,尽管在早期它是定义编译期常量的主要手段,但随着类的引入,静态整型常量也成为了一种选择。然而,enum类型的本质究竟是什么呢?本文将探讨enum类型的基本属性,内存占用以及它作为...

    Delphi与C++数据类型对照表

    本文将深入探讨Delphi和C++这两种语言之间的数据类型对照,帮助开发者更好地理解和转换这两种语言中的代码。 Delphi,原名Borland Pascal,是一种基于Pascal语言的面向对象的开发环境,以其高效、简洁的语法和强大...

    c++ 打印log 日志到文件

    本教程将深入探讨如何在C++中创建一个能够打印log到文件的系统,同时具备删除旧日志和设定日志文件大小的功能。 首先,我们需要理解日志的基本概念。日志通常包含程序运行过程中的信息,如错误信息、警告消息、调试...

    Professinal C++ 源代码

    《Professional C++》是一本深度探讨C++编程语言的专业书籍,涵盖了从基础到高级的大量主题,旨在帮助读者深入理解C++的精髓并提升编程技能。源代码是书中的实践部分,提供了丰富的示例和练习,让读者能够亲手操作,...

    [Online]C++_Conversation_CN.zip

    《C++对话中文版》是针对C++编程语言的一个学习资源,主要以对话的形式深入浅出地探讨了C++的基础知识、核心概念以及高级特性。这个CHM( Compiled HTML Help)文件包含了丰富的C++编程教程内容,旨在帮助初学者更好...

    Effective Modern C++.

    下面,我们将详细探讨这些新特性及其在实际编程中的应用。 1. **智能指针**: - `std::unique_ptr`:提供了独占所有权的资源管理,防止资源泄露。它不支持拷贝,但支持移动语义。 - `std::shared_ptr`:支持共享...

    rapidjson,glm,enum

    本篇文章将详细探讨"rapidjson","glm"以及"enum"这三个关键词所代表的库及其在实际开发中的应用。 首先,我们来看"rapidjson"。Rapidjson是一个开源的JSON解析器和生成器,主要用C++编写,设计目标是快速和小体积...

Global site tag (gtag.js) - Google Analytics