乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入理解C++枚舉類型enum

       herowuking 2015-09-30

      為啥需要枚舉類型

      編程語言中的所有特性都是為了滿足某種需求,達(dá)到某個目的還出現(xiàn).不會莫名其妙的出現(xiàn)在那.

      枚舉可以用來保存一組屬性的值.enum的全稱是enumeration意思是列舉

      看著這句話可能覺得太書面化了,不夠通俗易懂.那舉些通俗的例子說說.日常生活中我們特喜歡分類,比如讀書時分啥數(shù),理,化.當(dāng)官的級別有啥省長,市長,縣長.軍隊有軍長,師長,團(tuán)長.這樣一組組的屬性值就最適合用枚舉類型來表示.當(dāng)用一個軟件時,有些頁面會有很多單選按鈕(radio button),這也特別適合用枚舉來表示你舉了哪一個.

      光這樣說你可能還不能體現(xiàn)枚舉的好處.如果沒枚舉,表示一些組屬性的值你只能用一組數(shù)字,或者一組字符串.

      數(shù)字從字面上看不出任意意義,可讀性非常差,所以很少用.那就假如要你通過比較字符串來做很多種類判斷,比如 if(HisTitle == "stadholder")   else if(HistTile == "mayor") .如果讓你敲個幾十次你就知道是件多麻煩痛苦的事了,很多單詞如果敲錯一個意思就完全變了,這樣出現(xiàn)bug了也不容易找到.老是復(fù)制粘貼也較麻煩.所以字符串是編輯麻煩,容易出錯.如果要使用枚舉就極大的方便我們敲代碼,集成開發(fā)工具中的智能感應(yīng)會給你提示,敲個點號就帶出來了.而且枚舉會做類型檢查,不會像字符串那樣只能靠你自己去對比.

      枚舉類型的內(nèi)存分配問題

      上面我們講了如果沒有枚舉,一般會想到用數(shù)字或字符串表示某個類別.這樣使用肯定不方便.也許你可能會想到用宏來表示.比如#define 市長 "mayor" 或者#define 市長 2

      這自然是一個方法,但一來嘛在C++中是不太推薦用宏的,盡量少用.因為C++是強(qiáng)類型的語言,希望通過類型檢查來降低程序中的很多錯誤,而宏只是在編譯期前做簡單替換,繞過了類型檢查,失去了強(qiáng)類型系統(tǒng)的優(yōu)勢支撐. 二來嘛一組屬性值都是相關(guān)聯(lián)的信息,必須放到一起,放到一組.

      關(guān)于常量的誤解

      枚舉類型成員是常量

      這句話怎么理解呢.也就是說enum  MyEnum{ one = 1 , two , three} ;

      與 const int one = 1;  const int two = 2; const int three = 3; 差不多是一樣的.

      說到常量其實有個非常誤導(dǎo)人的地方因為用宏#define 可以定義的我們說是常量,這里只涉及到簡單的替換自然不可能存在內(nèi)存分配問題.但是用const定義的也叫常量,而const定義常量貌似跟定義一般的變量只多個const關(guān)鍵字. 你可能會想當(dāng)然認(rèn)為常量都只是簡單替換,所以不存在內(nèi)存分配.那按這個邏輯,豈不是const定義的常量,枚舉類型都沒有內(nèi)存分配?

      實際上大部分時候確實是這樣的.但并非總是如此,有些情況會需要分配內(nèi)存的.

      1.不需要分配內(nèi)存的情況

      如果定義常量const int one = 1;然后在其他地方只是把one作為右值賦值給其他變量那就不存在內(nèi)存分配.但這里的常量跟#define定義的常量不同,宏定義的常量是編譯前簡單替換掉,而不需要做類型檢查.而const定義的常量在編譯時會幫類型檢查,編譯完之后再做替換.所以編譯完之后就看不到const的信息了,轉(zhuǎn)換成對應(yīng)的值.const定義的信息只是保存在符號表中.

      那同樣,如果只是enum MyEnum{ one = 1 , two , three} ;這樣定義一個枚舉類型,然后也是簡單的作右值賦值給其他變量.比如int num = MyEnum::one;那也只是保存信息在符號表中,編譯后被替換掉了.

      有人可能說如果用sizeof MyEnum測下會發(fā)現(xiàn)會是4(這是VS里面,不同的編譯器可能不一樣)于是認(rèn)為不管是枚舉里面有多少個元素內(nèi)存分配都是4.實際上不是這意思,應(yīng)該是定義一個MyEnum類型的枚舉變量時會分配內(nèi)存.這跟定義了一個類一樣,你用sizeof去測一個為也會看到大小,但我們知道只有當(dāng)類實例化之后才實際分配內(nèi)存的.

      2.需要分配內(nèi)存的情況

      1.)const int one;是類的成員變量 2. )extern const int one = 123;    3.)const int one = 1;    int* pConst = &one;

      上面三種情況會需要分配內(nèi)存.

      而枚舉類型,如果不是簡單的去給其他變量賦值,而是去定義一個枚舉類型變量.

      比如MyEnum grade = MyEnum::one; //此時會分配4字節(jié)內(nèi)存空間.(不過據(jù)說編譯器會做優(yōu)化,如果枚舉類型所有值用兩個字節(jié)表示就足夠了,那實際分配的會就只會是兩字節(jié)了.不一定就是默認(rèn)的int類型的長度)

      枚舉類型具體用法

      一般的用法是在全局域內(nèi)定義一個枚舉類型.比如

      enum  MyEnum { one, two, three }

      如果不顯式指定,就會把第一個值默認(rèn)賦值為0,然后遞增1依次賦值.如果顯式指定了某個值,則它下一個是它加1.

      所以上面的例子中默認(rèn)one = 0; two = 1; three= 2;

      如果顯式指定enum MyEnum { one, two = 3, three }

      則one = 0; two = 3; three = 4;

      定義一個枚舉類型就是MyEnum grade = MyEnum::one;

      類中使用枚舉這是不太常用的用法.

      在類中聲明一個枚舉后,定義枚舉類型就可以省掉那個域作用前綴.比如MyEnum my = one; 在相同的作用域內(nèi)也不能出現(xiàn)某個變量的名字和枚舉中的元素名字相同,也就是不能出現(xiàn)其他變量名字是on,two, three

      另外枚舉還有一種少見的用法是

      enum { one ,two ,three};  就是不指定一個名字,這樣我們自然也沒法去定義一些枚舉類型了.此時就相當(dāng)于const int one = 0;這樣定義三個常量一樣.

      然后用的話就是int no = one;

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多