關於常量的誤解
列舉類型成員是常量:這句話怎麼理解呢.也就是說enum MyEnum{ one = 1 , two , three} ;
與const int one = 1; const int two = 2; const int three = 3; 差不多是一樣的.
說到常量其實有個非常誤導人的地方因為用#define(巨集,宏定義)#define可以定義的我們說是常量,這裡只涉及到簡單的替換自然不可能存在內存分配問題.但是用const定義的也叫常量,而const定義常量貌似跟定義一般的變量只多個const關鍵字.你可能會想當然認為常量都只是簡單替換,所以不存在內存分配.那按這個邏輯,豈不是const定義的常量,列舉類型都沒有內存分配?
實際上大部分時候確實是這樣的.但並非總是如此,有些情況會需要分配內存的.
1.不需要分配內存的情況
如果定義常量const int one = 1;然後在其他地方只是把one作為右值賦值給其他變量那就不存在內存分配.但這裡的常量跟#define定義的常量不同,#define(巨集,宏定義)定義的常量是編譯前簡單替換掉,而不需要做類型檢查.而const定義的常量在編譯時會幫類型檢查,編譯完之後再做替換.所以編譯完之後就看不到const的信息了,轉換成對應的值.const定義的信息只是保存在符號表中.
那同樣,如果只是enum MyEnum{ one = 1 , two , three} ;這樣定義一個列舉類型,然後也是簡單的作右值賦值給其他變量.比如int num = MyEnum:ne;那也只是保存信息在符號表中,編譯後被替換掉了.
有人可能說如果用sizeof MyEnum測下會發現會是4(這是VS裡面,不同的編譯器可能不一樣)於是認為不管是列舉裡面有多少個元素內存分配都是4.實際上不是這意思,應該是定義一個MyEnum類型的列舉變量時會分配內存.這跟定義了一個類一樣,你用sizeof去測一個為也會看到大小,但我們知道只有當類實例化之後才實際分配內存的.
在類中聲明一個列舉後,定義列舉類型就可以省掉那個域作用前綴.比如MyEnum my = one; 在相同的作用域內也不能出現某個變量的名字和列舉中的元素名字相同,也就是不能出現其他變量名字是on,two, three
另外列舉還有一種少見的用法是
enum { one ,two ,three}; 就是不指定一個名字,這樣我們自然也沒法去定義一些列舉類型了.此時就相當於const int one = 0;這樣定義三個常量一樣.
然後用的話就是int no = one;