C 11學習(4) 列舉類

2021-06-27 06:46:38 字數 1195 閱讀 3676

在現有的c++中有列舉型別,關鍵字為enum,然則它會存在三個問題:

1. 在那些不需要列舉型別表現為int型別時,它卻預設表現為int型別,這會導致錯誤發生。

2. 可轉換的列舉會使得他的列舉值在其周圍的**範圍內都是可見的,這可能會導致名字衝突。

3. 不可以指定列舉底層資料型別(只能是int型),這可能導致****不容易被理解和相容性問題,而且不可以進行前向宣告。

針對這些隱患,c++11提供了新的新的列舉——列舉類,也叫「強型別列舉」,是強型別的,帶有類域,與之前的列舉型別對比如下:

enum alter;	//傳統的列舉

enumclass color; //新的列舉類,具有類域,強型別的

enumclass trafficlight;

alter a = 7; //錯誤,傳統列舉不是強型別,a沒有資料型別

color c = 7; //錯誤,沒有預設的int到color

int a2 = red; //正確,只有alter的列舉值沒有類域,這裡的red肯定是alter的,alter列舉自動轉換成int

int a3 = alter::red; //c++11正確,指定了類域,c++98不正確

int a4 = blue; //錯誤,blue沒有指定類域

int a5 = color::blue; //錯誤,沒有color到int的轉換

color a6 = color::blue; //正確

新的列舉類,有著原本列舉的功能,又具備了類的特點,比如類域成員不能進行隱式型別轉換,如c和a5。另外,列舉類能夠指定列舉底層的資料型別,從而對列舉值的記憶體進行直觀控制。實現如:

enumclass color : char;
預設情況下,列舉值的型別是int型:

enumclass trafficlight;
同樣的,列舉類指定了底層資料型別從而就能夠前向宣告,在定義乙個列舉型別之前就使用這個列舉類,只要有個預先宣告即可。例如:

enumclass color_code:char;	//前向宣告

void foobar(color_code *p); //宣告的使用

//...

enumclass color_code:char; //定義

C 基礎 4 列舉

列舉和陣列 結構有些像。下面做個對比 列舉 enum 新型別名 陣列 資料型別 陣列名 元素個數 結構 struct 新型別名稱 列舉的不同之處在於,列舉量自己有自己的預設值,不同於陣列結構需要給成員 元素 賦值。比如,第乙個列舉量的值預設為0,第二個是1,第三個是2 以此類推。所以,如果定義時列舉...

Python類學習(九 列舉類Enum

目錄 1.兩種方式定義列舉類 1 直接使用enum 函式列出多個列舉值來建立列舉類 2 通過繼承enum類定義列舉類 2.列舉類定義建構函式 什麼是列舉類?物件有限且固定的類 比如季節類,只包括春夏秋冬四個物件 from enum import enum 定義season列舉類 season enu...

python學習筆記 30 列舉類

當我們需要定義常量時,乙個辦法是用大寫變數通過整數來定義,例如月份 jan 1 feb 2 mar 3 nov 11 dec 12好處是簡單,缺點是型別是int,並且仍然是變數。更好的方法是為這樣的列舉型別定義乙個class型別,然後,每個常量都是class的乙個唯一例項。python提供了enum...