深入討論C 的enum

2021-09-08 21:20:44 字數 1518 閱讀 6957

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意思是列舉 看著這句話可能覺得太書面化了,不夠通俗易懂.那舉些通俗的例子說說.日常生活中我們特喜歡分類,比如讀書時分啥數,理,化.當官的級別...