zoukankan      html  css  js  c++  java
  • C++之枚举

    1. 声明枚举类型格式

    enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6
    enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;Wed1=2
    enum {_Mon=2,_Tue,_Wed};//_Mon=2;_Tue=3;_Wed=4
    enumDay2{Mo,Tu=3,We,Fr=4};//Mo=0,Tu=3,We=4,Fr=4

    说说枚举类型中的常量。

    (1) 默认的枚举中第一个为0,此后每一个加1。假设遇到给定值的,后面的都是给定值加1。

    (2) 同意反复值的出现。

    (3) 这些值都为常量,不可改动。

    (4) 能够通过“枚举名::常量名”来訪问,也能够直接“常量名”来訪问(注意多个枚举的重名问题)。

    (5) 这些常量都会在编译时。使用常数替换掉。

    说说枚举名。

    (1) 和类名非常像,属于用户自己定义的数据类型。Enum就相当于class。枚举名就相当于类名。

    (2)sizeof(枚举名),普通情况下等于int的size==4.

    说说枚举变量

    (1) 能够通过枚举名定义枚举变量。注意枚举变量仅仅能使用两种方式赋值:

    enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6
    int _tmain(int argc, _TCHAR* argv[])
    {
           Dayd=Mon;//OK
           d=Day(10);//OK
           d=12;//ERROR
           const int j=2;
           d=j;//ERROR
           return 0;
    }

    要么是枚举常量中的值,要么是通过该枚举构造出来的值。

    能够看出这些变量是可变的。

    (2) 注意枚举变量和类对象的不同。它们全然不同。

    枚举变量就相当于一个整型。它不拥有该枚举定义好的常量,更不能“枚举变量.枚举常量”这么使用。而类对象能够。

    (3) 注意枚举变量不可被赋值为其它枚举的常量

    enum Day{ Mon,Tue=5,Wed};
    enum D{a};
    int _tmain(int argc, _TCHAR* argv[])
    {
           Daye=D::a;//ERROR
           return 0;
    }

    2. 说说类中的枚举

    class A
    {
    public:enum as{a,b,c,d,e};
              void foo(){int * a=newint[d];}//OK
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
           A a;
           A::asd=A::as::a;
           cout<<sizeof(A)<<endl;//1
           cout<<A::as::a<<endl;//0
           return 0;
    }

     (1) 当枚举在类中时,注意此时as仅仅是一个数据类型,地位和A差点儿相同。而a,b。c,d,e是枚举常量。

    (2) 该枚举不占内存。sizeof(A)=1.由于此时还未定义枚举变量。假设定义枚举变量就相当定义int变量:

    class A
    {
    public:enum as{a,b,c,d,e};
              as s;
              as s1;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
           cout<<sizeof(A)<<endl;//8
           return 0;
    }

    (3) 能够通过“类名::枚举名”来获得这个枚举类型。能够通过“类名::枚举常量”来获得该常量的值。

    (4) 枚举常量能够当作[]内的值,说明它的值在编译期就被固定了。

    总之:在类中的枚举。有点像内部类的感觉,类中的枚举常量,有点像类的conststatic常量。

    枚举有点像类,枚举名有点像类名,而枚举变量是整型变量,全然不同于类对象。枚举常量就相当于const常量。

    3. 枚举常量和const、#define的不同之处

    (1) 取一个const常量地址是合法的,而取一个枚举常量的地址是不合法的。

    由于编译期会被替换为常数。

    同理取一个#define地址也是不合法的。

    (2) 尽管枚举常量在编译期会被替换,可是会将枚举常量名保存在字符表中。假设后期有错误,编译器知道这个常数是枚举常量替换的。而#define也是在编译期被替换为常数。可是不保存宏名字,所以编译器后期仅仅能知道这个常数。不知道这个常数是被哪个宏名称替换的。

    4. 添加一些小知识

    (1) 因为枚举名是一个类型名。所以可作为函数返回类型。

    (2) 匿名定义一个枚举变量:

    enum {a,b,c,d,e} as;
    int _tmain(int argc, _TCHAR* argv[])
    {
           as=b;
           cout<<as<<endl;//1
           return 0;
    }

    注意此时as是一个枚举变量,不是枚举名。

    (3) 枚举变量未初始化

    假设该未初始化的枚举变量定义在全局,则能够打印出其值为0.

    假设该未初始化的枚举变量定义在主函数内部。则打印出错。

    (4) 枚举变量不能够使用as++;这种东西。就像类对象一样,是用户自己定义类型,不能够使用。

    (5)有问题的代码

    enum  as{a=1,b};
    void foo(as l)
    {
           if(l==a){}do sth
           else{}do sth because l must be b if l !=a.
    }

    这段代码不能实习其本意。

    特别是这句话“lmust be b if l !=a.”由于枚举变量的值不一定必须是as枚举常量。由于还能够存在这种语句“l=as(10);”。

    总结:枚举变量不一定全然是枚举常量的值。

    (6) cin>>枚举变量,是不合法的。

    cout<<枚举变量,是合法的。

    5. C++11增加的一些有关枚举的东西

    C++11中规定上面的曾经的枚举被成为UnScoped枚举。而如今我们又有了Scoped枚举。

    声明:enumclass/struct e_Name {…};

    定义枚举变量没啥差别。e_Namee1;不需加class/struct

    和以往的差别:

    (1) 使用的UnScoped枚举常量时。前面必须加上枚举名。“枚举名::枚举常量”。

    (2) UnScoped枚举常量不能够给int变量赋值。

  • 相关阅读:
    搭建本地源
    shell中tar加密打包
    mysql出现ERROR 1819 (HY000)的解决方法
    mysql 创建用户及授权(2)
    mysql 创建用户及授权(1)
    Redis 工具 redis-port 使用
    mysql中 drop、truncate和delete的区别
    dlerror和dlclose用法
    dlsym用法
    dlopen用法
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5326089.html
Copyright © 2011-2022 走看看