【c++11】 enum class: 強型別列舉
阿新 • • 發佈:2019-01-22
#include <iostream> int _tmain(int argc, _TCHAR* argv[]) { // 1、列舉型別的定義: // 普通列舉常量作用域提升至外圍(main函式之內)並且可以整型提升 enum Numbers {One=1, Two, Three}; // 強型別列舉常量的作用域僅限於Options型別之內,即{}之內; 並且不進行整型提升 // "One"雖然同名,但由於作用域不同,並不會名字衝突 // 關鍵字:enum class,位置不能交換 enum class Options {None, One, All=15}; // 2、普通列舉的名字衝突 { enum Numbers {One, Two, Three}; // enum Options {None, One, All}; // error! 名字衝突:"One"重定義 // int i = One; } // 3、列舉常量的整型提升 int i = One; // ok! Numbers's One, i=1 i += Three; // ok! // i = Options::One; // error! 強型別列舉常量並不能整型提升 i = static_cast<int>(Options::One); // ok! i=1 // 4、列舉變數的定義初始化 Numbers n; n = One; n = Numbers::One; // n += 1; // error! // n = All; // error! All不在作用域中,並且型別不匹配 // n = Options::One; // error! 試圖賦值Options型別的One,型別不匹配 Options o; // o = One; // error! 試圖賦值Numbers型別的One,型別不匹配 // o = All; // error! Options型別之All不在作用域範圍 o = Options::One; // ok! 必須使用作用域操作符來訪問強型別列舉常量 o = Options::All; // ok! // 5、在判斷語句中的列舉值 if(One<3){} // ok! if(n==1){} // ok! if(n<Three){} // ok! if(One<Three){} // ok! if(Options::All>Options::One){} // ok! if is true! if(o==Options::All){} // ok! if is true! // if(Options::All>10){} // error! // 6、指定列舉類的底層型別(列舉常量型別),預設時至少為int enum Enum1: unsigned int{first, second, third}; enum class Enum2: char{first, second, third}; enum Enum3: unsigned int{Red=-6, Blue, Yellow}; // warning C4369: “Red”: 列舉數的值“-6”不能表示為“unsigned int”,值是“4294967290” std::cout << Red << std::endl; enum class Enum4: char{first=10086, second, third}; // warning C4369: “first”: 列舉數的值“10086”不能表示為“char”,值是“102” // std::cout << Enum4::second << std::endl; // error! 強型別列舉Enum4沒有此操作,second不是整型 std::cout << (char)Enum4::second << std::endl; // enum class Enum4: double{Red=-6, Blue, Yellow}; //error:!“double”: 列舉的基礎型別非法,不是整型 return 0; }