一、enum初識(作用)
enum的全稱是enumeration意思是列舉,可以用一些符號表示一組屬性值,也就是將數字符號化,因爲數字表面看不出任何意義,可讀性很差。
例如,在貪吃蛇遊戲中表示地圖信息 enum MapInfo { GROUND , SNAKEHEAD ,SNAKEBODY } ;
相比於直接用0,1,2對地圖賦值可讀性強很多。
但是說到符號化數字,可以使用#define宏來達到相同目的,但是宏只是在編譯階段進行簡單的替換,編譯器不進行類型檢查而且在程序中大量使用宏也會使程序變得繁瑣。而enum類型在替換時會進行類型檢查,降低了程序出錯的可能性。
二、枚舉類型用法
1、枚舉成員的值
默認第一個成員爲0,以後依次+1
可以指定成員的值,以後的成員如果不指定,爲上一個成員值+1
2、對枚舉變量賦值
enum MapInfo { GROUND , SNAKEHEAD,SNAKEBODY } ;
MapInfo info = MapInfo::GROUND ;
當然也可以直接info = GROUND ;
3、限制賦值範圍
對一個枚舉變量賦值,如果直接使用整形常量,編譯器不允許,可以達到限制賦值範圍作用。
但是!仍然可以通過類型強制轉化,將整形常量轉化爲枚舉類型來進行賦值,只一點破壞了此作用。
4、int與枚舉類型
int可以接受任何枚舉類型成員和枚舉變量的賦值
枚舉類型變量正常情況下不能接受整形變量賦值。
三、枚舉類型和常量
C++中的常量,例如 const int a =5 ;在之後將a做爲右值對某變量賦值時,編譯器其實是將a出現的地方替換爲5.枚舉類型也是如此,將枚舉類型中的成員做爲一個常量,在編譯階段進行替換,所以此時不分配內存空間,這點可以查看彙編代碼。
例如:
enum Test { A,B,C} ;
int test = A ;
Test test2 = A ;
在編譯時:
int test = 0 ;
Test test2 = 0 ;
但是在定義一個枚舉類型的變量時,仍會分配內存空間。
但是枚舉類型變量的大小是多少呢?
四、枚舉類型變量的大小?
使用sizeof關鍵字,發現大小爲4字節,等效於int型,那是不是枚舉類型就是int型呢?
1、 爲何大小是4字節?
C++標準規定的是,枚舉類型的大小必須能容納最大的成員,而且不能超過int型大小
也就是說不一定是4字節,如果成員1個字節就能容下,那它就是1個字節,但是測試後發現爲什麼還是4字節?因爲這涉及到編譯器對程序的優化和某些CPU對對齊的4字節計算有更高的效率等等原因,所以通常就直接算4字節。
新的C++標準可以聲明佔用字節
enum Test : char {A,B,C} ;
此枚舉類型佔1字節
2、 等效於int型?
使用新版的VS,對枚舉類型變量直接賦值其他整形常量,發現編譯錯誤,提示說“無法從int型轉換爲***(枚舉類型名)型”所以說枚舉類型和int型還是不同的,編譯器區別對待!