C++ Primer Plus 學習筆記(複合型別)(二)
1. 結構(結構體)
結構是一種比陣列更靈活的資料格式,因為同一個結構可以儲存多種型別的資料,將資料的表示合併到一起。
結構是使用者定義的型別,而結構宣告定義了這種型別的資料屬性。定義了型別後,可以建立這種型別的變數。
1. 1 結構的定義方法
結構的定義如下面的例子:
struct inflatable // structure declaration
{
char name[20];
float volume;
double price;
};
定義結構後,可以建立該型別的變數:
inflatable hat; inflatable woopie_cushion; inflatable mainframe;
可以使用運算子 (.)來訪問各個成員,如hat.volume
, vincent.price
。
1. 2 結構的初始化
C++ 11 也支援將列表初始化用於介面,且等號(=)是可選的:
inflatable duck {"Daphne", 0.12, 9.98}
如果大括號內未包含,各個成員都將被設定為零。
inflatable mayer {};
cout << "mayer.name: " << mayer.name << endl;
cout << "mayer.volume: " << mayer.volume << endl;
cout << "mayer.price" << mayer.price << endl;
執行結果:
mayer.name:
mayer.volume: 0
mayer.price: 0
可以使用(=)將架構賦給另一個同類型的結構,這樣結構中每一個成員都將被設定為另一個結構中相應成員的值,即使成員是陣列,這種賦值被稱為成員賦值。
1. 3 結構陣列
可以建立元素為結構的陣列,方法和建立基本型別陣列完全相同。例如,建立一個100個 inflatable 結構的陣列,可以:
inflatable gifts[100];
gift 本身是一個數組,不是結構,gifts.price 是無效的。
初始化結構陣列,可以結合使用初始化陣列的規則和初始化結構的規則:
inflatable guest[2] =
{
{"Bambi", 0.5, 21.99},
{"Godzilla", 2000, 565.99}
};
1. 4 結構中的位欄位
C++ 可以指定佔用特定位數的結構成員,使得建立與某個硬體裝置上的暫存器對應的資料結構非常方便:
struct torgle_register
{
unsigned int SN : 4; // 4 bits for SN value
unsigned int : 4; // 4 bits unused
bool goodIn : 1; // valid input (1 bit)
bool goodTorgle : 1; // successful torgling
}
2. 共用體
共用體(union)是一種資料格式,它能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。比如,結構可以同時儲存 int、long 和 double,共用體只能儲存 int、long 或 double。
初始化
union one4all
{
int int_val;
long long_val;
double double_val;
};
使用
可以使用 one4all 變數來儲存 int、long 或 double,條件是在不同時間進行:
one4all pail;
pail.int_val = 15; // store a int
cout << pail.int_val << endl;
pail.double_val = 1.38; // store a double, int value is lost
cout << pail.double << endl;
3. 列舉
C++ 的 enum 工具提供了另一種建立符號常量的方式,這種方式可以代替 const。使用 enum 的句法與使用結構相似:
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
這條語句完成兩項工作:
- 讓 spectrum 稱為新型別的名稱;spectrum 被稱為列舉(enumeration),就像 struct 變數被稱為結構以一樣。
- 將 red、orange、yellow 等作為符號常量,他們對應整數值 0 ~ 7。這些常量叫做列舉量(enumerator)。
可以使用列舉名來宣告這種型別的變數:
spectrum band; // band a variable of type spectrum
在不執行強制型別轉換的情況下,只能將定義列舉是使用的列舉量賦給這種列舉的變數:
band = blue; // valid, blue is an enumerator
band = 2000; // invalid, 2000 not an enumerator
列舉量是整型,可被提升為 int 型別,但 int 型別不能自動轉換為列舉型別:
int color = blue; // valid, spectrum type promoted to int
band = 3; // invalid, int not converted to spectrum
color = 3 + red; // valid, red converted to int
設定列舉量的值
可以使用賦值運算子來顯式地設定列舉量的值:
enum bits{one = 1, two = 2, four = 4, eight = 8};
指定的值必須是整數,也可以只顯式地定義其中一些列舉量的值:
enum bigstep {first, second = 10, third};
這裡,first 在這種情況下為 0。後面沒有被初始化的列舉量的值將比前面的列舉量大 1。因此,third 的值為 101。
可以建立多個值相同的列舉量
enum {zero, null = 0, one, numero_uno = 1};
其中,zero 和 null 都為 0,one 和 numero_uno 都為 1。
列舉的取值範圍
C++ 可以通過強制轉換,增加可賦給列舉量的合法值。每個列舉都有取值範圍,通過強制型別轉換,可以在取值範圍中的任何整數值賦給列舉變數,即使這個是不是列舉值。
enum bits{one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6);
這裡 6 不是列舉值,但它位於列舉定義的取值範圍內。
取值範圍的上限,為大於列舉量最大值的,最小 2 次冪減 1。例如最大列舉值為 101,在 2 次冪中比這個數大的最小值為 128,因此上限為 127。
取值範圍的下限。如果最小值不小於 0,下限為 0。否則採取找上限的方式但加上負號。例如,最小列舉量為 -6,而比它小的、最大的 2 次冪是 -8,因此下限為 -7。