从Java到C++--枚举类型的使用

引言

今天做项目想用一个枚举类型,本来想这样写的:

enum Move {left, right, up, down}; Move move = Move.left; if(move == Move.left) { cout

结果不行,这是怎么回事,原来在C++里不允许这样使用,C++中枚举的用法和Java还不一样。然后我的纳闷了,非要把枚举类型的用法觉察透不可。

枚举是一组具有相似含意的常量的组合,我们在项目中常常会用到这种枚举类型。

Java中的枚举类型:
Java 中的枚举类型采用关键字enum 来定义,是一个特殊的类,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。Enum的定义如下:
public abstract class Enum>extends Object implements Comparable, Serializable

【例1】枚举的简单使用

enum Move{left, right, up, down}; public static void main(String args[]) { System.out.println(Move.left); System.out.println(Move.right); System.out.println(Move.up); System.out.println(Move.down); }

结果如下:
left
right
up
Down
上面这段代码中,Move其实是一个类,应该是一个Enum的子类。left, right, up, down是Enum的对象,应该是Move类中public static成员,Move中还有三个 static方法:
public static Move[] values();
public static Move Move.valueOf(String name);
public static T Move.valueOf(Class enumType, String name);
由于不能看到其底层的实现,本身只能说“应该”,就上面这个例子,根据其用法,本人推测期内部现实的原理是这样的
从Java到C++--枚举类型的使用

Enum中定义中一系列与枚举相关的方法,查API可知:vcD4KPHRhYmxlIGJvcmRlcj0="1" cellspacing="0" cellpadding="0">

protected Object


clone()
抛出 CloneNotSupportedException。


int


compareTo(E o)
比较此枚举与指定对象的顺序。


boolean


equals(Object other)
当指定对象等于此枚举常量时,返回 true。


ClassE>


getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。


int


hashCode()
返回枚举常量的哈希码。


String


name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。


int


ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。


String


toString()
返回枚举常量的名称,它包含在声明中。


static


>
T


valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。

【例2】enum中其它的用法

enum Move{left, right, up, down}; public static void main(String args[]) { Move m = Move.down; System.out.println(m); Move[] moves = Move.values(); System.out.println(moves[0]); Move m2 = Move.valueOf("right"); System.out.println(m2); System.out.println(Move.up.name()); System.out.println(Move.up.ordinal()); }

结果如下:

down

left

right

up

2

参考文章:

http://blog.csdn.net/wgw335363240/article/details/6359614

C++中的枚举类型:

定义的格式:

enum [EnumeName] {, ...i>}[name]; (1)

说明:

[]:表示可选,可以有,也可以缺省不写;

EnumeName:枚举的类型名;

name:枚举的对象名;

C++11标准后,枚举又分为两种类型:不限定作用域限定作用域,不限定作用域的类型也就是上面的定义(1),限定作用域的定义格式如下:

enum class (struct)[EnumeName] {, ...i>}[name]; (2)

下面以例子的形式分别介绍这两种枚举类型的用法:

不限定作用域

【例3】:引言中问题的正确写法

//移动的枚举类型

enum Move {left, right, up, down}; Move move = Move::left; if(move == Move::left) { cout

【例4】枚举成员的访问

//移动的枚举类型 enum Move {left, right, up, down}; cout
笔记:
1,枚举成员的作用域与枚举类型本身的作用域相同;
2,可以直接访问枚举成员,也可以通过枚举类型的作用域来访问对应类型的成员;

【例5】枚举对象的初始化和赋值

enum Move {left, right, up, down}; Move m1 = left; Move m2 = Move::right; Move m3 = m1; cout

结果:
0
1
0
笔记:
1,枚举对象可用枚举成员或另一个枚举对象对其进行赋值;
2,不限定作用域的枚举没有默认类型,不能用其它基本类型的变量对其进行赋值,如以下的形式赋值都是错误的:
Move m5 = 5;
int i =4;
Move m6 = i;

【例6】给枚举成员指定值

enum Move {left, right, up, down}; cout
结果:
0 1 2 3
2 3 3 4
笔记:
1,枚举成员默认从0开始,依次加1;
2,可以在定义枚举类型时给一个或几个成员指定值;

【例7】基本数据类型赋值

enum Move : long{ left, right, up, down}; int i1 = left; int i2 = right; long l = up; double d = down; cout
结果为:
1
2
3
4

限定作用域
限定作用域的枚举类型,枚举成员作用域遵循常规的作用域准则,在枚举类型的作用域外不可访问;不同的枚举类型可以定义相同名字的枚举成员,因为其在各自的作用域内。
【例8】枚举成员的访问

enum class Move { left, right, up, down }; Move m1 = Move::left;//通过枚举类型的作用域来访问 //不可以直接访问枚举成员, 因为其在作用域外不可见 //Move m2 = right; //提示: 'right' : undeclared identifier //Move中定义了left,在Direction中依然可以定义,互不冲突 enum class Direction{ left, west, east}; Direction d1 = Direction::left;

笔记:
1,iostream中的out没有实现对限定作用域的枚举类型,所有不能输出类似于枚举类型:cout
【例9】指定数据类型

enum class Move : long{ left =255, right, up, down}; Move m1 = Move::left;

笔记:
1,限定作用域的枚举类型可以指定数据类型
2,如果没有指定类型,则枚举成员的默认类型是int

限定作用域与不限定作用域的枚举类型对上面【例3】和【例6】的用法相同。

点击复制链接 与好友分享!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
上一篇:HDU 1676 Full Tank? 限制最短路(difficult)
下一篇:hdu-4497-GCD and LCM-gcd的性质
相关文章

c++中布尔类型的入门教程

C/C++中枚举类型(enum)的入门教程

C/C++中数组和指针类型的关系的入门教

C++箴言:用成员函数模板接受兼容类型

C++箴言: 教你为类型信息使用特征类

C++ VS C#(3):switch,类型转换

C++中四种类型转换符的总结

C++检查浮点类型能否转换为整型

C++类型转换方式总结

C++类型转换方式总结

图文推荐

从Java到C++--枚举类型的使用
ZOJ 3640 Help Me
从Java到C++--枚举类型的使用
CF 518C(Anya and
从Java到C++--枚举类型的使用
hdu 1016 Prime R
UVA - 11987 - A

分类:默认分类 时间:2015-03-03 人气:1
本文关键词:
分享到:

相关文章

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.044 (s). 10 q(s)