關於C++中enum的探討


如果一個變量你需要幾種可能存在的值,那么就可以被定義成為枚舉類型。之所以叫枚舉就是說將變量或者叫對象可能存在的情況也可以說是可能的值一一例舉出來。

舉個例子來說明一吧,為了讓大家更明白一點,比如一個鉛筆盒中有一支筆,但在沒有打開之前你並不知道它是什么筆,可能是鉛筆也可能是鋼筆,這里有兩種可能,那么你就可以定義一個枚舉類型來表示它!

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

  這里要說一下,如果你想定義兩個具有同樣特性枚舉類型的變量那么你可以用如下的兩種方式進行定義!

enum box{pencil,pen};

enum box box2;//或者簡寫成box box2;

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

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

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

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

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

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

  前面說了那么多,下面給出一個完整的例子大家可以通過以下的代碼的學習進行更完整的學習!

#include <iostream>
using namespace std;

void main(void)
{
    enum egg {a,b,c};
    enum egg test; //在這里你可以簡寫成egg test;

     test = c; //對枚舉變量test進行賦予元素操作,這里之所以叫賦元素操作不叫賦值操作就是為了讓大家明白枚舉變量是不能直接賦予算數值的,例如(test=1;)這樣的操作都是不被編譯器所接受的,正確的方式是先進行強制類型轉換例如(test = (enum egg) 0;)!

    if (test==c)
     {
        cout <<"枚舉變量判斷:test枚舉對應的枚舉元素是c" << endl;
     }

    if (test==2)
     {
        cout <<"枚舉變量判斷:test枚舉元素的值是2" << endl;
     }

    cout << a << "|" << b << "|" << test <<endl;

    test = (enum egg) 0; //強制類型轉換
    cout << "枚舉變量test值改變為:" << test <<endl;
    cin.get();
}

  看到這里要最后說一個問題,就是枚舉變量中的枚舉元素(或者叫枚舉常量)在特殊情況下是會被自動提升為算術類型的!

#include <iostream>
using namespace std;

void main(void)
{
    enum test {a,b};
    int c=1+b; //自動提升為算術類型
    cout << c <<endl;
    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語言,你要必須知道一件事:一切都是對象,一切都有類型···

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM