今天做項目想用一個枚舉類型,本來想這樣寫的:
enum Move {left, right, up, down}; Move move = Move.left; if(move == Move.left) { cout << "move up" << endl; }
結果不行,這是怎麼回事,原來在C++裡不允許這樣使用,C++中枚舉的用法和Java還不一樣。然後我的納悶了,非要把枚舉類型的用法覺察透不可。
枚舉是一組具有相似含意的常量的組合,我們在項目中常常會用到這種枚舉類型。
Java 中的枚舉類型采用關鍵字enum 來定義,是一個特殊的類,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum 類型。Enum的定義如下:
public abstract class Enum
【例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
由於不能看到其底層的實現,本身只能說“應該”,就上面這個例子,根據其用法,本人推測期內部現實的原理是這樣的
Enum中定義中一系列與枚舉相關的方法,查API可知:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHRhYmxlIGJvcmRlcj0="1" cellspacing="0" cellpadding="0">
protected Object
clone()
拋出 CloneNotSupportedException。
int
compareTo(E o)
比較此枚舉與指定對象的順序。
boolean
equals(Object other)
當指定對象等於此枚舉常量時,返回 true。
Class<E>
getDeclaringClass()
返回與此枚舉常量的枚舉類型相對應的 Class 對象。
int
hashCode()
返回枚舉常量的哈希碼。
String
name()
返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
int
ordinal()
返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。
String
toString()
返回枚舉常量的名稱,它包含在聲明中。
static
T
valueOf(Class
返回帶指定名稱的指定枚舉類型的枚舉常量。
【例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
定義的格式:
enum [EnumeName] {
說明:
[]:表示可選,可以有,也可以缺省不寫;
EnumeName:枚舉的類型名;
name:枚舉的對象名;
C++11標准後,枚舉又分為兩種類型:不限定作用域和限定作用域,不限定作用域的類型也就是上面的定義(1),限定作用域的定義格式如下:
enum class (struct)[EnumeName] {
下面以例子的形式分別介紹這兩種枚舉類型的用法:
【例3】:引言中問題的正確寫法
//移動的枚舉類型
enum Move {left, right, up, down}; Move move = Move::left; if(move == Move::left) { cout << "move up" << endl; }
【例4】枚舉成員的訪問
//移動的枚舉類型 enum Move {left, right, up, down}; cout << left << endl; //可以直接訪問枚舉成員 cout << Move::left << endl; //通過枚舉類型的作用域來訪問 enum Direction{left, west}; //VS2010上編譯不通過,提示:'left' : redefinition; previous definition was 'enumerator' //因為Move的left成員和Direction的left成員在相同的作用域下,重復定義
筆記:
1,枚舉成員的作用域與枚舉類型本身的作用域相同;
2,可以直接訪問枚舉成員,也可以通過枚舉類型的作用域來訪問對應類型的成員;
【例5】枚舉對象的初始化和賦值
enum Move {left, right, up, down}; Move m1 = left; Move m2 = Move::right; Move m3 = m1; cout << m1 << endl; cout << m2 << endl; cout << m3 << endl;
結果:
0
1
0
筆記:
1,枚舉對象可用枚舉成員或另一個枚舉對象對其進行賦值;
2,不限定作用域的枚舉沒有默認類型,不能用其它基本類型的變量對其進行賦值,如以下的形式賦值都是錯誤的:
Move m5 = 5;
int i =4;
Move m6 = i;
【例6】給枚舉成員指定值
enum Move {left, right, up, down}; cout << left << " " << right << " " << up << " " << down << endl; enum Direction{east = 2, sourth, west = 3, north}; cout << Direction::east << " " << Direction::sourth << " " << Direction::west << " " << Direction::north << endl;
結果:
0 1 2 3
2 3 3 4
筆記:
1,枚舉成員默認從0開始,依次加1;
2,可以在定義枚舉類型時給一個或幾個成員指定值;
【例7】基本數據類型賦值