C++學習大綱:枚舉類型

C++ 枚舉類型

枚舉類型是一種可以由用戶自定義數據集的數據類型。

注意:bool類型可以看成是C++語言提供的一個預定義的枚舉類型。

1. 枚舉類型定義

enum {};

2. 初始化

枚舉類型的每一個枚舉值都對應一個整型數,默認情況下,第一個枚舉值的值是0,然後依次增1,但也可以顯示初始化任意一個枚舉值對應的整形數,沒定義的枚舉值默認情況下在其前一個枚舉值的對應整型數上加1.

留個問題:如果多個枚舉值對應同一個整形數會怎樣?

enum Day {Sun=7, MON=1, TUE, WED, THU, FRI, SAT}

3. 枚舉變量的定義

;

或{} ;

4. 枚舉變量的使用

1)賦值

Day d1,d2;

d1 = SUN; //true

d2 = 3; //error, 但int n = SUN;也是可以的

d2 = (Day)3;//true 但這樣不安全,必須要保證該整型數屬於枚舉類型的值集,否則沒有意義

2)比較運算

MON < TUE的結果為true,運算時將其轉換為整型

3)算術運算

d2 = d1 + 1;//error,因為它d1 + 1的結果是整型

d2 = (Day)(d1 + 1);//true

4)其他

輸入輸出:可以輸入int數,使用switch,然後複製或者輸出

類下標訪問:day(0)對應的是第一個枚舉值sun

————————————————


C++學習大綱:枚舉類型

枚舉

enum枚舉量聲明、定義、使用與枚舉類詳解


C++學習大綱:枚舉類型


眾所周知,C/C++語言可以使用#define和const創建符號常量,而使用enum工具不僅能夠創建符號常量,還能定義新的數據類型,但是必須按照一定的規則進行,下面我們一起看下enum的使用方法。

(1)首先,請看下面的語句:


enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

這句話有兩個作用:

第一:聲明enumType為新的數據類型,稱為枚舉(enumeration);

第二:聲明Monday、Tuesday等為符號常量,通常稱之為枚舉量,其值默認分別為0-6。(後面會介紹怎樣顯式的初始化枚舉量的值)


(2)接著利用新的枚舉類型enumType聲明這種類型的變量:enumType Weekday'就像使用基本變量類型int聲明變量一樣,如 int a;也可以在定義枚舉類型時定義枚舉變量enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;

然而與基本變量類型不同的地方是,在不進行強制轉換的前提下,只能將定義的枚舉量賦值給該種枚舉的變量,如:Weekday = Monday;或者Weekday = Sunday;不能將其他值賦給枚舉變量,如:Weekday = 10;這是不允許的,因為10不是枚舉量。也就是說Weekday只能是定義的Monday-Sunday這些定義過的枚舉量。然而這不是絕對的,第六條會講到利用強制類型轉換將其他類型值賦給枚舉變量

(3)上面講不能將非枚舉量賦給枚舉變量,那麼能不能將枚舉量賦給非枚舉變量呢?如:int a=Monday;這是允許的,因為枚舉量是符號常量,這裡的賦值編譯器會自動把枚舉量轉換為int類型。

(4)前面講可以對枚舉進行賦值運算,那枚舉變量能不能進行算術運算呢?

Weekday++;Weekday = Monday + Tuesday;這是非法的,因為這些操作可能導致違反類型限制,比如:Weekday = Sunday;

Weekday++;Weekday首先被賦予枚舉量中的最後一個值Sunday(值為6),再進行遞增的話,Weekday增加到7,而對於enumType類型來說,7是無效的。

總結:對於枚舉,只定義了賦值運算符,沒有為枚舉定義算術運算。


(5)不能對枚舉量進行算術運算,那麼枚舉量能不能參與其他類型變量的運算呢?int a;a = 1 + Monday;這是允許的,因為編譯器會自動把枚舉量轉換為int類型。


(6)第二條講:在不進行強制轉換的前提下,只能將定義的枚舉量賦值給該種枚舉的變量,言下之意就是可以通過強制轉換將其他類型值賦給枚舉變量:

Weekday = enumType(2);等同於:Weekday = Wednesday;但是,如果試圖將一個超出枚舉取值範圍的值通過強制轉換賦給枚舉變量,會出現什麼結果?

Weekday = enumType(20);結果將是不確定的,這麼做不會出錯,但得不到想要的結果。

步驟(二)——自定義枚舉量的值


(1)前面講通過定義enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

枚舉量Monday、Tuesday等的值默認分別為0-6,我們可以顯式的設置枚舉量的值:

enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};

指定的值必須是整數

(2)也可以只顯式的定義一部分枚舉量的值:

enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};這樣Monday、Wednesday均被定義為1,則Tuesday=2,Thursday、Friday、Saturday、Sunday的值默認分別為2、3、4、5.總結:未被初始化的枚舉值的值默認將比其前面的枚舉值大1。

(3)第二條還說明另外一個現象,就是枚舉量的值可以相同。

步驟(三)——枚舉的取值範圍

前面講到可以通過強制轉換將其他類型值賦給枚舉變量:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及枚舉取值範圍的概念:枚舉的上限是 大於最大枚舉量的 最小的2的冪,減去1;

枚舉的下限有兩種情況:一、枚舉量的最小值不小於0,則枚舉下限取0;二、枚舉量的最小值小於0,則枚舉下限是 小於最小枚舉量的 最大的2的冪,加上1。

舉例來講:

假如定義 enum enumType1 { First=-5,Second=14,Third=10 };則枚舉的上限是16-1=15(16大於最大枚舉量14,且為2的冪); 枚舉的下限是-8+1=-7(-8小於最小枚舉量-5,且為2的冪);


步驟(四)——枚舉應用


個人覺得枚舉switch是最好的搭檔:enum enumType{Step0, Step1, Step2}Step=Step0;//注意這裡在聲明枚舉的時候直接定義了枚舉變量Step,並初始化為Step0

switch (Step)

{

case Step0:{...;break;}

case Step1:{...;break;}

case Step2:{...;break;}

default:break;

}

另外枚舉還有一種少見的用法是 enum { one ,two ,three}; 就是不指定一個名字,這樣我們自然也沒法去定義一些枚舉類型了。此時就相當於static const int one = 0;這樣定義三個常量一樣。然後用的話就是int no = one。


————————————————————————————————————————————————————————

一、簡述

強類型枚舉(Strongly-typed enums),號稱枚舉類型,是C++11中的新語法,用以解決傳統C++枚舉類型存在的缺陷。傳統C++中枚舉常量被暴漏在外層作用域中,這樣若是同一作用域下有兩個不同的枚舉類型,但含有相同的枚舉常量也是不可的,比如:

<code>enum Side{Right,Left};enum Thing{Wrong,Right};/<code>

這是不能一起用的。
另外一個缺陷是傳統枚舉值總是被隱式轉換為整形,用戶無法自定義類型。C++11中的強類型枚舉解決了這些問題。

—————————————————————————

二、強類型枚舉

強類型枚舉使用enum class語法來聲明,如下:

<code>enum class Enumeration{ VAL1, VAL2, VAL3=100, VAL4};/<code>

這樣,枚舉類型時安全的,枚舉值也不會被隱式轉換為整數,無法和整數數值比較,比如(Enumeration::VAL4==10會觸發編譯錯誤)。

另外枚舉類型所使用的類型默認為int類型,也可指定其他類型,比如:

<code>enum calss Enum:unsigned int{VAL1,VAL2};/<code>

正如前面所說,強類型枚舉能解決傳統枚舉不同枚舉類下同枚舉值名的問題,使用枚舉類型的枚舉名時,必須指明所屬範圍,比如:Enum::VAL1,而單獨的VAL1則不再具有意義。

還有一點值得說明的是C++11中枚舉類型的前置聲明也是可行的,比如:

<code>enum calss Enum;enum class Enum1:unsigned int;/<code>

—————————————————————————

三、項目中的強類型枚舉代碼片段

1、圖像處理

<code>enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};/<code>

2.交通燈

<code>enum class TrafficLight{RED,YELLOR,GREEN};/<code>

強類型枚舉值具有傳統枚舉的功能——命名枚舉值,同時又具有類的特點——具有類域的成員和無法進行默認的類型轉換。所以也稱之為枚舉類——enmu class

枚舉類的底層數據必須是有符號或無符號整型,比如char unsigned int unsigned long,默認為int。

<code>enmu class Clolor:char;  //前置聲明枚舉類void Foo(Color*p);        //前置聲明的使用//....................enum class Color:char{RED,GREEN,BLACK,WHITE};                       //前置聲明的定義/<code>

C++學習大綱:枚舉類型

通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。

原文鏈接:https://blog.csdn.net/haitaolang/article/details/70014201


分享到:


相關文章: