程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 從Java到C++——枚舉類型的使用

從Java到C++——枚舉類型的使用

編輯:C++入門知識


引言

今天做項目想用一個枚舉類型,本來想這樣寫的:

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


結果不行,這是怎麼回事,原來在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);

由於不能看到其底層的實現,本身只能說“應該”,就上面這個例子,根據其用法,本人推測期內部現實的原理是這樣的

\

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 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 << "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】基本數據類型賦值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved