1. 程式人生 > >C++11:強型別列舉(enum)

C++11:強型別列舉(enum)

// C++11之前的enum型別是繼承C的,不溫不火;
// C++11對enum動刀了,加強了型別檢查,推出強型別enum型別,眼前一亮
// 使用過QT 的都知道,早就應該這麼做了,用的很爽!!

// 一、C中enum型別的侷限
// 1、非強型別作用域

enum type1{a, b, c};
enum type2{a, d, e};

//問題來了,兩種列舉型別都有a列舉常量,而且作用域相同,發生了衝突

//2、允許隱式型別轉換

if(type1::a == type2::d){;}

//兩種不同enum常量比較沒有實際意義,但是編譯器是先將enum常量轉換為int型別後,再比較的,不會報錯

// 3、佔用儲存空間極其符號不確定

enum type3{a=1, b=0xFFFFFFFFFLL};
cout<<sizeof(type3::a)<<endl;//可能為8,視編譯器而定,由其對齊字長決定的
cout<<type3::b<<endl;//輸出大小不定,可能為0

//問題來了,儲存大小和符號都有未定的因素

// 二、C++11強型別enum型別

//語法:

enum class type4:type{a, b, c};//加class,具名,指定底層型別type
enum class type5{a, b, c};//不指定底層型別

//特點及用法:
// 1、強作用域

type4 t = type4::a; //必須指定強型別名稱
type4 p = a;        //錯誤

//2、不可隱式轉換

if(t<type4::b);                   //同一個enum型別比較,可以
if(t>type5::b);                   //非同一個enum型別,不能隱式轉換為int等值,不嗯呢該比較
if((int)t > (int)type5::b)        //強制型別轉換,可以通過

//3、可以指定底層型別

enum class type6:char{a=1, b=2};
enum class type7:unsigned int{a=0xFFFFFFFF};

//既可以節省空間,又可以指定符號

//三、C++11是相容並拓展了C enum型別的

enum type8:char{a=1, b=2};
type8 t =a;

//拓展併兼容C enum型別