1. 程式人生 > >C++Primer之4.6列舉讀書筆記

C++Primer之4.6列舉讀書筆記

C++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。它還允許定義新型別,但必須按照嚴格的限制進行。使用enum的句法與使用結構相似。例:

enum spectrum{red,orange,yellow,green,blue,violet,indigo,ultraviolet};
#這條語句完成了兩項工作
   #1.讓spectrum成為新型別的名稱;spectrum被稱為列舉(enumeration),就像struct被稱為結構體一樣。
   #2.將red、orange、yellow等作為符號常量,它們對應的數值0~7.這些常量叫做列舉量。

在預設情況下,將整數值賦給列舉量,第一個列舉量的值是0,第二個是1,依此類推,可以通過顯式地指定整數值來覆蓋預設值。

可以用列舉名來宣告這種型別的變數:

spectrum band; // band a variable of type spectrum

在不進行強制型別轉換的情況下,只能將定義列舉時使用的列舉量賦給這種列舉的變數。例:

band=blue; // vaild,blue is an enumerator
band=2000;//invaile,2000 not an enumerator

對於列舉,只定義了賦值運算子,沒有為列舉定義算術運算:

band=orange;   // valid
++band;        // not vaild 
band=orange+red; //not vaild,but a little tricky

列舉量是整型,可被提升為Int型別,但int型別不能自動轉換為列舉型別:

int color =blue; // vaild,spectrum type promoted to int
band=3; //invaild,int not convered to spectrum
color =3+red;  //vaild,red converted to int
  1. 設定列舉量的值

          可以使用賦值運算子來顯式地設定列舉量的值:

enum bits{one=1,two=2,four=4,eight=8};
#指定的值必須是整數。也可以只顯式地定義其中一些列舉量的值:
enum bigstep{first,second=100,third}; //first在預設情況下為0,後面沒有被初始化的列舉量的值將比前面的列舉量大1.因此third的值為【0】(上取整0)
##可以建立多個值相同的列舉量:
enum{zero,null=0,one,numero_uno=1}; //其中zero和null都為0,one和numero_uno都為1.

   2.列舉的取值範圍

          每個列舉都有取值範圍,通過強制型別轉換,可以將取值範圍中的任何整數值賦給列舉量,即使這個值不是列舉值。

#設bits和myflag的定義如下:
enum bits{one =1,two=2,four=4,eight=8};
bits myflag;
myflag =bits(6)  //vaild,because 6 is in bits range 其中6不是列舉值,但它位於列舉定義的取值範圍內。

取值範圍的定義:

  首先,要找出上限,需要知道列舉量的最大值。找到大於這個最大值的、最小的2的冪,將它減去1,得到的便是取值範圍的上限。要計算下限,需要知道列舉量的最小值。如果它不小於0,則取值範圍的下限為0;否則,採用與尋找上限方式相同,但加上負號。