enum的秘密<一>:enum是“使用者自訂類型”
呵呵,enum在實際中應用比較少,所以你會忽略它。但是,在這裡,我告訴你,enum 和 struct、class一樣,都是使用者自訂類型。
對呀!enum是使用者自訂類型,他有資料成員,還有成員函數!
For example:
enum e{a=1 , b=2 , c=4};
那麼:
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{ a=2, b=4 };
首先找到其絕對值的最大值,但為了容易理解,我先不談負數,也就是先找到其最大值,這裡的最大值是4。
4 用二進位表示就是 100,也就是需要3bits才能最小的容納下4這個值,而3bits所能表示的範圍是 0-7,於是e1的取值範圍為[0,7]。
現在來看看負數,
enum e2{ a=-2, b=4 };
其中絕對值最大的是4,需要3bits才能容納下,但因為可以取負值(而最大元素b=4不是負值),也就是說需要增加一個符號位,那麼就需要4bits。
4bits的取值範圍是 1000 - 0111(二進位表示),也就是 -8 到 7(十進位表示)。
enum e3{ a=-4, b=2 } 就只需要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)。嘿嘿。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/d04421024/archive/2009/09/09/4532296.aspx