為了解決c/c++中的enum型別的一系列缺點,比如:非強型別,允許隱式轉換為int型,占用儲存空間及符號性不確定。c++11引入了列舉類(又稱為:強列舉型別strong-typed enum)
語法格式:
enum
class 型別名
; 如:enum
class
people
;
//這樣就成功的定義了乙個強型別的列舉people。
注意:等價於 enum struct 型別名;
(enum class中的成員沒有公有私有之分,也不會使用
模板來支援泛化的功能)
3.1 強型別的列舉優點
(1)強作用域:強型別的列舉成員的名稱不會被輸出到其父作用域空間;
(2)轉換限制:強型別列舉成員的值不可以與int隱式的相互轉換。
(3)可以指定底層型別。強型別列舉底層型別為int,但是也可以顯示的指定底層型別。具體方法:在enum名稱後面加:「:type」,其中type可以是除wchar_t以外的任何int,如下:
enum
class
people
:type char
;//指定了people為基於char的強列舉型別。
示例3中詳細說明強列舉的特點:
#include
#include
#include
#include
using
namespace std;
enum
class
color
;enum
class
;int
main
(int argc,
char
**ar**)
if//編譯通過if1
)if((
int1
)//編譯通過,顯示的型別轉換
return0;
}
4 . c++11對enum型別進行了擴充套件
主要有2個:
(1)對於底層的基本型別;這個參考前面的「強型別的優點(3)
(2)對於其作用域的擴充套件。在c++11中,列舉成員的名字除了會自動輸出到父作用域,也可以在列舉型別定義的作用域內有效。
示例4:
enum color
;enum color color = red;
color = yellow;
color = color::yellow;
//yello 和color::yellow這兩種形式都是合法的
5 . c++11中匿名的強型別列舉
疑問:若在程式中,宣告了乙個匿名的強列舉型別,應該怎麼去使用?
示例5:
#include
using
namespace std;
enum
class
color;
intmain
(int argc,
char
**ar**)
通過上面的示例5**可以得知:若宣告 了乙個匿名的強列舉型別和示例,我們是無法對其示例進行設定值或去進行比較的,因此官方建議:在使用enum class(強列舉型別)的時候,應該總是提供乙個名字。 C 11 強型別列舉
c 11引入了一種新的列舉型別,即 列舉類 或 強型別列舉 宣告強型別列舉非常簡單,只需要在enum後加上class或struct即可。例如 enum old 老形式 enum class new 新形式 enum struct new2 新形式傳統的c 列舉型別有一些缺點 如果在相同作用域中的兩個...
C 基礎之強列舉型別
在標準c 中,列舉型別不是型別安全的。列舉型別被視為整數,這使得兩種不同的列舉型別之間可以進行比較。c 03 唯一提供的安全機制是乙個整數或乙個列舉型值不能隱式轉換到另乙個列舉別型。此外,列舉所使用整數型別及其大小都由實現方法定義,皆無法明確指定。最後,列舉的名稱全數暴露於一般範圍中,因此c 03兩...
C 11 強型別列舉(enum)
c 11之前的enum型別是繼承c的,不溫不火 c 11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮 使用過qt 的都知道,早就應該這麼做了,用的很爽!一 c中enum型別的侷限 1 非強型別作用域 enum type1 enum type2 問題來了,兩種列舉型別都有a列舉常...