zoukankan      html  css  js  c++  java
  • 深入讨论C++的enum

    enum的秘密<一>:enum是“用户自定义类型”

        呵呵,enum在实际中应用比较少,所以你会忽略它。但是,在这里,我告诉你,enum 和 struct、class一样,都是用户自定义类型。
        对呀!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是个离散量集合,太理想化了^_^,简单思考一下就破了,不多说,入正题:
    如何确定一个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)。嘿嘿。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/d04421024/archive/2009/09/09/4532296.aspx

  • 相关阅读:
    前端水印
    canvas中图片大小自适应
    了解CSS变量var
    vue报错Adjacent JSX elements must be wrapped in an enclosing tag.
    修改Batch3DModelContent的片元着色器:让白模穿品如的衣服
    Cesium 顶点着色器中求解模型坐标
    Centos6.5部署及yum源注意事项
    linux常用命令
    复旦大学数学学院 18 级本科生对高等代数学习方法指导书的评价
    复旦大学数学学院 17 级本科生对高等代数学习方法指导书的评价
  • 原文地址:https://www.cnblogs.com/lancidie/p/1976814.html
Copyright © 2011-2022 走看看