enum的秘密《一》:enum是「使用者自定義型別」
呵呵,enum在實際中應用比較少,所以你會忽略它。但是,在這裡,我告訴你,enum 和 struct、class一樣,都是使用者自定義型別。
對呀!enum是使用者自定義型別,他有資料成員,還有成員函式!
for example:
enum e;
那麼:001: enum e e1; //enum e不是物件,它是型別,e1才是型別enum的物件!
002: e e1; //e是型別enum e的簡寫哦!
003: e1 = 1; //絕對的錯誤!int怎能賦值給乙個使用者自定義型別
004: e1 = e(); //e()? 對呀,你沒看錯,預設建構函式
005: e1 = e(1) //e(int)? 嘿嘿,這才是從int構造enum e型別物件的建構函式
006:e1 = a; //哈哈,預設呼叫「拷貝建構函式」···雖然有點不完備
大膽的想:enum會不會有使用者自定義成員函式呢?呵呵,我是沒有實驗出來。要不,你自己試試?
感想:c++雖然是初期的oo語言,但是型別化的概念已經深入到了語言本身。面對一門oo語言,你要必須知道一件事:一切都是物件,一切都有型別···
enum的秘密《二》:enum的「取值範圍」和「記憶體分配」
先糾正乙個常見錯誤,很多人認為enum是個離散量集合,太理想化了^_^,簡單思考一下就破了,不多說,入正題:
如何確定乙個enum的取值範圍?
for example:
enum e1;
首先找到其絕對值的最大值,但為了容易理解,我先不談負數,也就是先找到其最大值,這裡的最大值是4。
4 用二進位制表示就是 100,也就是需要3bits才能最小的容納下4這個值,而3bits所能表示的範圍是 0-7,於是e1的取值範圍為[0,7]。
現在來看看負數,
enum e2;
其中絕對值最大的是4,需要3bits才能容納下,但因為可以取負值(而最大元素b=4不是負值),也就是說需要增加乙個符號位,那麼就需要4bits。
4bits的取值範圍是 1000 - 0111(二進位制表示),也就是 -8 到 7(十進位制表示)。
enum e3 就只需要3bits,取值範圍是[-4,3]。
簡單的說就是找到最少的能容納下所有的元素的位數
為什麼要獲取enum的取值範圍?因為c++標準規定超出列舉型別表示範圍的賦值結果是undefined的。
也就是說 e2 x = (e2)6 是肯定正確的,而 e2 y = (e2)8 行為是未定義的。
undefined的含義我就不多說了,想怎麼去歪解就怎麼去歪解^_^
enum的記憶體分配呢?
比如 e2 需要3bits,那麼c++規定e2的尺寸只要容得下3bits就行,到底是取1個byte,還是4個byte,還是...,那由編譯器自己決定。但是,c++標準在這裡有個限制:1<= sizeof(enmu)<=sizeof(int)。嘿嘿。
深入討論C 的enum
呵呵,enum在實際中應用比較少,所以你會忽略它。但是,在這裡,我告訴你,enum 和 struct class一樣,都是使用者自定義型別。對呀!enum是使用者自定義型別,他有資料成員,還有成員函式!for example enum e 那麼 001 enum e e1 enum e不是物件,它是...
Enum深入解析
人生有涯,學海無涯 列舉就是乙個語法糖效果。定義乙個列舉,其實就是定義乙個繼承抽象類enum的類。了解了enum,就能了解列舉。public abstract class enum enum implements comparable serializable列舉類實現了comparable和ser...
深入理解C 列舉型別enum
參考 程式語言中的所有特性都是為了滿足某種需求,達到某個目的還出現.不會莫名其妙的出現在那.列舉可以用來儲存一組屬性的值.enum的全稱是enumeration意思是列舉 看著這句話可能覺得太書面化了,不夠通俗易懂.那舉些通俗的例子說說.日常生活中我們特喜歡分類,比如讀書時分啥數,理,化.當官的級別...