国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

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

2019-11-08 03:11:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

目錄(?)[+]

為啥需要枚舉類型枚舉類型的內(nèi)存分配問(wèn)題關(guān)于常量的誤解不需要分配內(nèi)存的情況需要分配內(nèi)存的情況枚舉類型具體用法

為啥需要枚舉類型

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

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

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

 

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

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

 

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

 

上面我們講了如果沒(méi)有枚舉,一般會(huì)想到用數(shù)字或字符串表示某個(gè)類別.這樣使用肯定不方便.也許你可能會(huì)想到用宏來(lái)表示.比如#define 市長(zhǎng) “mayor” 或者#define 市長(zhǎng) 2

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

 

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

枚舉類型成員是常量

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

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

 

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

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

 

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

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

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

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

 

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

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

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

而枚舉類型,如果不是簡(jiǎn)單的去給其他變量賦值,而是去定義一個(gè)枚舉類型變量.

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

 

 

枚舉類型具體用法

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

enum  MyEnum { one, two, three }

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

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

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

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

 

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

 

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

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

另外枚舉還有一種少見(jiàn)的用法是

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

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 浪卡子县| 绥阳县| 西乡县| 诏安县| 常熟市| 西盟| 华容县| 伊川县| 隆回县| 房产| 舟山市| 洮南市| 翼城县| 凤阳县| 景德镇市| 宕昌县| 朔州市| 遵化市| 登封市| 应城市| 隆子县| 闽清县| 浠水县| 同仁县| 平邑县| 右玉县| 桂林市| 环江| 黄山市| 孟津县| 海盐县| 卫辉市| 会昌县| 南雄市| 西昌市| 泗水县| 正宁县| 勃利县| 保山市| 乌恰县| 牡丹江市|