深入討論C++的enum

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.