1 // C++11之前的enum類型是繼承C的,不溫不火; 2 // C++11對enum動刀了,加強了類型檢查,推出強類型enum類型,眼前一亮 3 // 使用過QT 的都知道,早就應該這么做了,用的很爽!! 4 5 // 一、C中enum類型的局限 6 // 1、非強類型作用域 7 8 enum type1{a, b, c}; 9 enum type2{a, d, e}; 10 11 //問題來了,兩種枚舉類型都有a枚舉常量,而且作用域相同,發生了沖突 12 13 //2、允許隱式類型轉換 14 15 if(type1::a == type2::d){;} 16 17 //兩種不同enum常量比較沒有實際意義,但是編譯器是先將enum常量轉換為int類型后,再比較的,不會報錯 18 19 // 3、占用存儲空間極其符號不確定 20 21 enum type3{a=1, b=0xFFFFFFFFFLL}; 22 cout<<sizeof(type3::a)<<endl;//可能為8,視編譯器而定,由其對齊字長決定的 23 cout<<type3::b<<endl;//輸出大小不定,可能為0 24 25 //問題來了,存儲大小和符號都有未定的因素 26 27 // 二、C++11強類型enum類型 28 29 //語法: 30 31 enum class type4:type{a, b, c};//加class,具名,指定底層類型type 32 enum class type5{a, b, c};//不指定底層類型 33 34 //特點及用法: 35 // 1、強作用域 36 37 type4 t = type4::a; //必須指定強類型名稱 38 type4 p = a; //錯誤 39 40 //2、不可隱式轉換 41 42 if(t<type4::b); //同一個enum類型比較,可以 43 if(t>type5::b); //非同一個enum類型,不能隱式轉換為int等值,不嗯呢該比較 44 if((int)t > (int)type5::b) //強制類型轉換,可以通過 45 46 //3、可以指定底層類型 47 48 enum class type6:char{a=1, b=2}; 49 enum class type7:unsigned int{a=0xFFFFFFFF}; 50 51 //既可以節省空間,又可以指定符號 52 53 //三、C++11是兼容並拓展了C enum類型的 54 55 enum type8:char{a=1, b=2}; 56 type8 t =a; 57 58 //拓展並兼容C enum類型
FROM : https://blog.csdn.net/hustyangju/article/details/41978973?utm_source=tuicool&utm_medium=referral