C++11:強型別列舉(enum)
阿新 • • 發佈:2019-02-09
// 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型別