1. 程式人生 > 實用技巧 >共用體和列舉

共用體和列舉

共用體

共用體(union)是一種資料格式,能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。例如:結構可以同時儲存int、long和double,共用體只能儲存int、long或double。用法與結構類似。

union one4all
{
	int int_val;
	long long_val;
	double doubel_val;
};
//可以使用one4all變數來儲存int、long或doubel,前提是在不同的時間使用
one4all pail;
pail.int_val = 15;
cout << pail.int_val;
pail.double_val = 1.38;
cout << pail.double_val;

因為共用體每次只能儲存一個值,因此必須有足夠的空間來儲存最大的成員。

共用體的使用

當資料項使用兩種或更多格式(但不會同時使用)時,可節省空間。例如:一些商品的ID為整數,而另一些為字串時,可以進行下面的方法:

struct widget =
{
char brand[20];
int type;
union id
{
	long id_num;
	char id_char[20];
}id_val;	//定義共用體的同時,建立了一個共用體型別的id_val變數
};
...
widget prize;
...
if (prize.type == 1)
	cin >> prize.id_val.id_num;
else
	cin >> prize.id_val.id_char;

匿名共用體沒有名稱,其成員將成為位於相同地址處的變數。

struct widget =
{
char brand[20];
int type;
union id
{
	long id_num;
	char id_char[20];
};	//定義共用體的同時,建立了一個共用體型別的id_val變數
};
...
widget prize;
...
if (prize.type == 1)
	cin >> prize.d_num;
else
	cin >> prize.id_char;
//id_num和id_char被視為prize的兩個成員,它們地址相同

列舉

C++的enum工具提供了另一種建立符號常量的方式,可以用來替代const。定義 列舉方式如下:

enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet};
  • spectrum被稱為列舉(enumeration),是一種新型別(類似於int、long、double等型別),就像struct變數被稱為結構一樣。
  • red、orange、yellow等作為符號常量,依次對應整數0~7,稱為列舉量。(預設情況下第一個列舉量為0,第二個列舉量為1)

建立列舉變數

建立列舉變數

spectrum band;	//建立一個spectrum型別的列舉變數
band = blue;	//意為將bule對應的4賦給band
band = 2000;	//錯誤,只能將定義列舉時的列舉常量賦給列舉變數,所以受spectrum影響band只有8個可能值
band = spectrum(3);	//等同於將3賦給band,前提是()內的int值是在定義的列舉量中才行

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

band = orange;	//正確
++band;	//錯誤
band = orange + red; 	//錯誤

而且,列舉量是整型,可以被提升為int型別,但是int型別不可以轉換為列舉型別

int color = blue;	//blue是列舉常量,color是int變數
band = 3;	//3是int型別,band是列舉型別,不能將int轉換為列舉
color = 3 + red;	//正確使用,運算前red由列舉型別轉換為int型別,再進行運算
band = orange + red;	//錯誤使用,列舉沒有算術運算子,且運算前orange和red轉換為int型別了

設定列舉量的值

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

enum bits {one = 1, two = 2, four = 4, eight = 8};	//指定的值必須是整數
enum bigstep {first, second = 100, third};	//first預設為0,沒被初識化的列舉量的值比前面的列舉量大1,故third值為101
enum spectrum {zero, null = 0, one, numero_uno = 1};	//這屬於正確設定列舉量的值

列舉的取值範圍

enum bigstep {first, second = 100, third};

列舉取值範圍的定義:上限,找出列舉量的最大值,然後找到大於這個最大值的、最小的2的冪,將他減1,例如:bigstep中最大列舉值是101,在2的冪中,比這個數大的最小值為128,因此取值範圍為127;下限,找出列舉量的最小值,如果它不小於0,則取值範圍下限為0,否則,採用與尋找上限一樣的方式,彈藥加上負號,例如:如果最小值是-6,而比它小的、最大的2的冪是-8,因此下限為-7。

enum bits {one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6);	//屬於正確的賦值,雖然6不是列舉值,但6在列舉的取值範圍之內,可以使用