關於C++中enum的探討

 若是一個變量你須要幾種可能存在的值,那麼就能夠被定義成爲枚舉類型。之因此叫枚舉就是說將變量或者叫對象可能存在的狀況也能夠說是可能的值一一例舉出來。html

舉個例子來講明一吧,爲了讓你們更明白一點,好比一個鉛筆盒中有一支筆,但在沒有打開以前你並不知道它是什麼筆,多是鉛筆也多是鋼筆,這裏有兩種可能,那麼你就能夠定義一個枚舉類型來表示它!ios

 

  
  
  
  
  1. enum box{pencil,pen};//這裏你就定義了一個枚舉類型的變量叫box,這個枚舉變量內含有兩個元素也稱枚舉元素在這裏是pencil和pen,分別表示鉛筆和鋼筆。 

 這裏要說一下,若是你想定義兩個具備一樣特性枚舉類型的變量那麼你能夠用以下的兩種方式進行定義!ide

 

  
  
  
  
  1. enum box{pencil,pen};  
  2.  
  3. enum box box2;//或者簡寫成box box2; 

  再有一種就是在聲明的時候同時定義。函數

 

  
  
  
  
  1. enum {pencil,pen}box,box2; //在聲明的同時進行定義! 

    枚舉變量中的枚舉元素系統是按照常量來處理的,故叫枚舉常量,他們是不能進行普通的算術賦值的,(pencil=1;)這樣的寫發是錯誤的,可是你能夠在聲明的時候進行賦值操做!學習

 

  
  
  
  
  1. enum box{pencil=1,pen=2}; 

可是這裏要特別注意的一點是,若是你不進行元素賦值操做那麼元素將會被系統自動從0開始自動遞增的進行賦值操做,說到自動賦值,若是你只定義了第一個那麼系統將對下一個元素進行前一個元素的值加1操做,例如spa

 

  
  
  
  
  1. enum box{pencil=3,pen};//這裏pen就是4系統將自動進行pen=4的定義賦值操做! 

    前面說了那麼多,下面給出一個完整的例子你們能夠經過如下的代碼的學習進行更完整的學習!htm

 

  
  
  
  
  1. #include <iostream>  
  2. using namespace std;  
  3.  
  4. void main(void)  
  5. {  
  6.     enum egg {a,b,c};  
  7.     enum egg test; //在這裏你能夠簡寫成egg test;  
  8.  
  9.      test = c; //對枚舉變量test進行賦予元素操做,這裏之因此叫賦元素操做不叫賦值操做就是爲了讓你們明白枚舉變量是不能直接賦予算數值的,例如(test=1;)這樣的操做都是不被編譯器所接受的,正確的方式是先進行強制類型轉換例如(test = (enum egg) 0;)!  
  10.  
  11.     if (test==c)  
  12.      {  
  13.         cout <<"枚舉變量判斷:test枚舉對應的枚舉元素是c" << endl;  
  14.      }  
  15.  
  16.     if (test==2)  
  17.      {  
  18.         cout <<"枚舉變量判斷:test枚舉元素的值是2" << endl;  
  19.      }  
  20.  
  21.     cout << a << "|" << b << "|" << test <<endl;  
  22.  
  23.     test = (enum egg) 0; //強制類型轉換  
  24.     cout << "枚舉變量test值改變爲:" << test <<endl;  
  25.     cin.get();  

 看到這裏要最後說一個問題,就是枚舉變量中的枚舉元素(或者叫枚舉常量)在特殊狀況下是會被自動提高爲算術類型的!對象

 

  
  
  
  
  1. #include <iostream>  
  2. using namespace std;  
  3.  
  4. void main(void)  
  5. {  
  6.     enum test {a,b};  
  7.     int c=1+b; //自動提高爲算術類型  
  8.     cout << c <<endl;  
  9.     cin.get();  

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語言,你要必須知道一件事:一切都是對象,一切都有類型···blog

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)。嘿嘿。

原文:http://hi.baidu.com/wy_51131/blog/item/7251e7cf45d38d0592457e87.html#0

相關文章
相關標籤/搜索