本文目錄一覽:
- 1、枚舉類型enum用法
- 2、enum怎麼用?
- 3、ENUM的賦值和使用
- 4、枚舉類型的用法?
枚舉類型enum用法
enum是用來聲明枚舉類型數據。
它可以像數組一樣存儲許多的元素,但是不同於數組的是,它除了數字不能存儲以外,其他類型的如字母、特殊符號、漢字都可以以任意組合存入enum當中去。
enum的聲明:enum A { a, b, c };
enum聲明不同於數組,其只可以聲明在Main()方法體外,在Main()中可以被調用。
enum的枚舉數值默認是從0開始的,但是也可以強制元素序列進行改變。enum A {a=1, b, c};這樣就可以實現了。
enum可以通過枚舉名加點通過枚舉的元素訪問枚舉數值。例:
int i = (int)A.a;枚舉值雖然是int類型的,但是也必須進行顯示的強制轉換。
同樣enum也可以通過枚舉數值來訪問枚舉內的各個元素。方法是:Console.WriteLine( ” (A)1 ” );這樣就可以訪問enum內的各個元素。
enum怎麼用?
一個enum是定義一組值的對象,它可以包括零個或多個值成員。只須定義一個enum型的對象.enum對象的值都會自動獲得一個數字值,從0開始,依次遞增。如:
EnumDemo.java
package net.javagarage.enums;
public class EnumDemo{
private enum Seasons{
winter,spring,summer,fall
}
public static void main(String[]args){
for(Seasons s:Seasons.values()){
System.out.println(s);
}
}
}
儘管enums有這麼多的屬性,但並不是用的越多越好,如果那樣還不如直接用類來的直接.enums的優勢在定義int最終變數僅當這些值有一定特殊含義時.但是如果需要的是一個類,就定義一個類,而不是enum。
擴展資料:
枚舉值是常量,不是變數。不能在程序中用賦值語句再對它賦值。枚舉元素本身由系統定義了一個表示序號的數值,從0開始順序定義為0,1,2…。如在weekday中,sun值為0,mon值為1,sat值為6。
只能把枚舉值賦予枚舉變數,不能把元素的數值直接賦予枚舉變數。如一定要把數值賦予枚舉變數,則必須用強制類型轉換。
ENUM的賦值和使用
枚舉類型在使用中有以下規定:
1. 枚舉值是常量,不是變數。不能在程序中用賦值語句再對它賦值。
2. 枚舉元素本身由系統定義了一個表示序號的數值,從0開始順序定義為0,1,2…。如在weekday中,sun值為0,mon值為1,sat值為6。
只能把枚舉值賦予枚舉變數,不能把元素的數值直接賦予枚舉變數。如一定要把數值賦予枚舉變數,則必須用強制類型轉換。
如: a=(enum weekday)2;特別注意:在VS2010等編譯器中,強制轉換格式應為:(weekday)2,如果前面加上了enum,編譯時會出現「類型重定義」的錯誤。
其意義是將順序號為2的枚舉元素賦予枚舉變數a,相當於: a=tue;還應該說明的是枚舉元素不是字元常量也不是字元串常量,使用時不要加單、雙引號。 輸出結果:1 monday 2 tuesday 3 wendsday 4 thursday 5 friday6 saturday 7 sunday 8 monday 9 tuesday 10 wendsday11 thursday 12 friday 13 saturday 14 sunday 15 monday16 tuesday 17 wendsday 18 thursday 19 friday 20 saturday21 sunday 22 monday 23 tuesday 24 wendsday 25 thursday26 friday 27 saturday 28 sunday 29 monday 30 tuesday3. 如果枚舉值與一些關鍵字衝突,例如: enum course{begin,then,end};由於程序有可能使用了iostream,並且使用了命名空間std,這時如果直接使用end進行賦值就有可能出現「不明確」符號的錯誤。解決此問題,有兩個方法:
(1)定義枚舉值時應避免使用常用關鍵字,可以加前綴進行區分
例如: enum course{e_begin,e_then,e_end};(2)可以在枚舉值前面加入枚舉類型:course::end
枚舉類型的用法?
C/C++中枚舉類型(enum)
如果一個變數你需要幾種可能存在的值,那麼就可以被定義成為枚舉類型。之所以叫枚舉就是說將變數或者叫對象可能存在的情況也可以說是可能的值一一例舉出來。 舉個例子來說明一吧,為了讓大家更明白一點,比如一個鉛筆合中有一支筆,但在沒有打開之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就可以定義一個枚舉類型來表示它! enum box{pencil,pen};//這裡你就定義了一個枚舉類型的變數叫box,這個枚舉變數內含有兩個元素也稱枚舉元素在這裡是pencil和pen,分別表示鉛筆和鋼筆。
在這裡要說一下,如果你想定義兩個具有同樣特性枚舉類型的變數那麼你可以用如下的兩種方式進行定義! enum box{pencil,pen}; enum box box2;//或者簡寫成box box2;
再有一種就是在聲明的時候同時定義。 enum {pencil,pen}box,box2; //在聲明的同時進行定義!
枚舉變數中的枚舉元素系統是按照常量來處理的,故叫枚舉常量,他們是不能進行普通的算術賦值的,(pencil=1;)這樣的寫發是錯誤的,但是你可以在聲明的時候進行賦值操作! enum box{pencil=1,pen=2};
但是這裡要特別注意的一點是,如果你不進行元素賦值操作那麼元素將會被系統自動從0開始自動遞增的進行賦值操作,說到自動賦值,如果你只定義了第一個那麼系統將對下一個元素進行前一個元素的值加1操作,例如 enum box{pencil=3,pen};//這裡pen就是4系統將自動進行pen=4的定義賦值操作!
C++ 中的枚舉類型繼承於 C 語言。就像其他從 C 語言繼承過來的很多特性一樣,C++ 枚舉也有缺點,這其中最顯著的莫過於作用域問題——在枚舉類型中定義的常量,屬於定義枚舉的作用域,而不屬於這個枚舉類型。例如下面的示例:enum FileAccess {
Read = 0x1,
Write = 0x2,
};FileAccess access = ::Read; // 正確
FileAccess access = FileAccess::Read; // 錯誤C++枚舉的這個特點對於習慣面向對象和作用域概念的人來說是不可接受的。首先,FileAccess::Read 顯然更加符合程序員的直覺,因為上面的枚舉定義理應等價於如下的定義(實際上,.NET 中的枚舉類型便是如此實現的):class FileAccess {
static const int Read = 0x1;
static const int Write = 0x2;
};其次,這導致我們無法在同一個作用域中定義兩個同樣名稱的枚舉值。也就是說,以下的代碼是編譯錯誤:enum FileAccess {
Read = 0x1,
Write = 0x2,
};enum FileShare {
Read = 0x1, // 重定義
Write = 0x2, // 重定義
};如果這一點沒有讓你惱怒過的話,你可能還沒寫過多少 C++ 代碼 :-)。實際上,在最新的 C++0x 標準草案中有關於枚舉作用域問題的提案,但最終的解決方案會是怎樣的就無法未卜先知了,畢竟對於象 C++ 這樣使用廣泛的語言來說,任何特性的增刪和修改都必須十分小心謹慎。當然,我們可以使用一些迂迴的方法來解決這個問題(C++ 總是能給我們很多驚喜和意外)。例如,我們可以把枚舉值放在一個結構里,並使用運算符重載來逼近枚舉的特性:struct FileAccess {
enum __Enum {
Read = 0x1,
Write = 0x2
};
__Enum _value; // 枚舉值 FileAccess(int value = 0) : _value((__Enum)value) {}
FileAccess operator=(int value) {
this-_value = (__Enum)value;
return *this;
}
operator int() const {
return this-_value;
}
};我們現在可以按照希望的方式使用這個枚舉類型:FileAccess access = FileAccess::Read;並且,因為我們提供了到 int 類型的轉換運算符,因此在需要 int 的地方都可以使用它,例如 switch 語句:switch (access) {
case FileAccess::Read:
break;
case FileAccess::Write:
break;
}當然我們不願意每次都手工編寫這樣的結構。通過使用宏,我們可以很容易做到這一點:#define DECLARE_ENUM(E) \
struct E \
{ \
public: \
E(int value = 0) : _value((__Enum)value) { \
} \
E operator=(int value) { \
this-_value = (__Enum)value; \
return *this; \
} \
operator int() const { \
return this-_value; \
} \
\
enum __Enum {#define END_ENUM() \
}; \
\
private: \
__Enum _value; \
};我們現在可以按如下的方式定義前面的枚舉,並且不比直接寫 enum 複雜多少。DECLARE_ENUM(FileAccess)
Read = 0x1,
Write = 0x2,
END_ENUM()DECLARE_ENUM(FileShare)
Read = 0x1,
Write = 0x2,
END_ENUM()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/194593.html