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变量赋值。

时间: 2024-12-22 04:46:22

C++之枚举的相关文章

C# 枚举

一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. 枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类型,继承自S

C++ 枚举定义

我们在平常的编程中,时常需要为一些属性定义一组可以选择的值,比如文件打开的状态可能会有三种:输入 输出和追加 我们一般情况下记录这些状态是让每一个状态和一个常数相对应   比如 1 const int input=0; 2 const int output=1; 3 const int append=2; 这个方法虽然也是可以得,不过它有一个明显的缺点就是    没有指出这些值是相关联的 而C++中的  枚举  提供了一种替代的方法   不但可以定义常数集   还可以将其聚集成组    如下:

java 枚举常用操作

在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { } JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { } public class TrafficLight { public void change() {

java 枚举的应用

使用枚举的方式 实现上一篇中介绍的例子:并增加功能,输出今天执行的内容: import java.util.Calendar;import java.util.Date; /** * 周 的枚举 */public enum Day { WORK(1, 2, 3, 4, 5) { @Override public void doThing() { System.out.println("工作..."); } },//工作日 STA(6) { @Override public void d

C#枚举类型的常用操作总结

枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型. 编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段.C#编译器将枚举类型视为基元类型. 1.获取枚举列表:         /// <summary>         /// 获取枚举列表         /// <

Swift学习之位移枚举的按位或运算

在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift语言里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 //位移枚举typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutores

【BZOJ-1218】激光炸弹 前缀和 + 枚举

1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1778  Solved: 833[Submit][Status][Discuss] Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值.激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破

获取枚举类型Description特性的描述信息

C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExtensions { public static string GetDescription(this object value) { if (value==null) return string.Empty; Type type = value.GetType(); var fieldInfo = ty

JavaSE复习_6 枚举类

△单例类是指只有一个实例,而枚举类实际上就是有有限个实例的类,在类里已经把实例定义好了. △枚举类的三种创建形式: 1) enum Week { MON,TUE,WED;//枚举类有默认构造函数创建的三个实例} } 2) enum Week { MON("星期一"), TUE( "星期二"),WED ("星期三" ); //具有参数的构造函数 private String name; Week(String name) { this. name=

Android 开发 之 Enum (枚举) —— @IntDef的使用

官方文档说明,安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存.参 http://developer.android.com/training/articles/memory.html#Overhead 那么如果需要使用Enum应该怎么做呢? https://noobcoderblog.wordpress.com/2015/04/12/java-enum-and-android-intdefstringdef-annotation/ public class