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

C++之枚举的更多相关文章

  1. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  2. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

  3. Objective-C枚举的几种定义方式与使用

    假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...

  4. Help Hanzo (素数筛+区间枚举)

    Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...

  5. 枚举:enum

    枚举 所谓枚举就是指定好取值范围,所有内容只能从指定范围取得. 例如,想定义一个color类,他只能有RED,GREEN,BLUE三种植. 使用简单类完成颜色固定取值问题. 1,就是说,一个类只能完成 ...

  6. .NET 基础一步步一幕幕[方法、结构、枚举]

    方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...

  7. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

  8. 用枚举enum替代int常量

    枚举的好处: 1. 类型安全性 2.使用方便性 public class EnumDemo { enum Color{ RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN ...

  9. c#编程基础之枚举

    枚举的意义就在于限制变量取值范围. 当可以确定的几种取值时才可以用. 如果输入一个字符串需要进行判断是否是我们需要的字符串时,则一般需要这样写: using System; using System. ...

  10. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

随机推荐

  1. Uva 1354 Mobile Computing

    题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...

  2. 【转】.Net程序员玩转Android系列之三~快速上手

    原文:http://www.cnblogs.com/HouZhiHouJueBlogs/p/3962122.html 快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: ...

  3. bzoj 2401: 陶陶的难题I 数论

    2401: 陶陶的难题I Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 24[Submit][Status] Descript ...

  4. Android 获取SDCard上图片和视频的缩略图

    获取图片缩略图和视频缩略图的方法: Java代码: import java.io.File; import android.app.Activity; import android.graphics. ...

  5. nodemon

    使用nodemon让node自动重启 开发环境,修改代码服务器自动重启 npm install -g nodemon nodemon app.js

  6. ECSHOP首页调用指定分类下的商品

    转:http://bbs.ecshop.com/thread-1123207-1-1.html 调用某个分类下的商品,方法有很多种的,不过都需要先在后台设置模板那里设置显示和显示条数, 然后在需要调用 ...

  7. Android 解决安装Egit时Egit Mylyn和org.eclipse.team.core报错

    为了让Aptana支持GitHub,需要安装Egit,但在的时候碰到两个错误,一个是关于缺少EGit Mylyn另一个是缺少org.eclipse.egit.import.feature.group. ...

  8. 国内外最全的asp.net开源项目

    转自:http://www.cnblogs.com/fengtangquan/archive/2010/10/19/1855472.html 最近一些项目开始用到CMS系统,最开始是研究JAVA的,无 ...

  9. Devexpress之barManager

    隐藏菜单栏左边的竖线和右边的箭头? 1.隐藏菜单栏上右边的箭头属性设置:OptionsBar=>>AllowQuickCustomization=False 2.隐藏菜单栏左边的竖线属性设 ...

  10. yml文件数据的简洁表达方法(Hashes to OpenStruct)

    通过ruby编写测试脚本的时候,我还是喜欢采用yml来管理测试数据,就像以前的文章(Selenium WebDriver + Grid2 + RSpec之旅(五))提到的一样,但是在引用yml中的数据 ...