關於C++中enum的探討

來源:互聯網
上載者:User

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.