1. 程式人生 > >C++ Primer Plus 學習筆記(複合型別)(二)

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。