1. 程式人生 > >類方法-成員初始化列表

類方法-成員初始化列表

        首先理解建立物件與呼叫建構函式的過程。呼叫建構函式時,物件將在括號中的程式碼執行之前被建立。也就是說先創建出物件,然後再進入建構函式的花括號執行語句。

假設有一個Queue類

Class Queue
{
private:
    struct Node{Item iten; struct Node * next};
    Node *front;
    Node * rear;
    int items;
    const int qsize;
    .....
public:
    .....
};

假設此時他的建構函式為:

Queue::Queue(int qs)
{
    front = rear = NULL;
    items = 0;
    qsize = qs;
}

這樣的情況下,這個建構函式是無法通過編譯的,因為資料成員含有const。

        借用文中第一句話,我們可以知道,呼叫Queue(int qs)建構函式將導致程式首先給4個成員變數分配記憶體,然後流程執行進入花括號內,使用常規的賦值方式將值儲存到記憶體中。因此,對於const資料成員,必須在執行到建構函式體之前,即建立物件時進行初始化。

        C++提供了一種特殊的語法完成這種工作——成員初始化列表,如下所示

Queue::Queue (int qs) : qsize(qs)     //initialize qsize to qs
{
    front = rear = NULL;
    items = 0;
}

這樣寫建構函式,對於出現的const int qsize 會在建立物件時同時被賦值;

        然而這種方法並不限於初始化常量,可以將Queue的建構函式寫成如下所示:

Queue::Queue (int qs) : qsize(qs), front(NULL), rear(NULL), items(0)
{
}

總結:

        如果Classy是一個類,而mem1,mem2,mem3都是這個類的資料成員,則類建構函式可以使用如下的語法來初始化資料成員:  

Classy::Classy (int m, int n) : mem1(n),mem2(0), mem3(m*n+2)
{
.........
}

上述程式碼mem1初始化為n,mem2初始化為0,mem3初始化為m*n+2。從概念上說初始化工作是在物件建立時完成的,此時還未執行括號中的任何程式碼。請注意以下幾點:

                   ① 這種格式只能用於建構函式

                   ② 必須用這種格式初始化非靜態const資料成員

                   ③ 必須用這種形式初始化引用資料成員

        資料成員被初始化的順序與他們出現在類宣告中的順序相同,與初始化器中的排列順序無關。

        對於被宣告為應用的變數,也是隻能在被建立時進行初始化,因此,也必須使用初始化列表的方式。


拓展:

        成員列表初始化使用括號的方式也可應用於常規初始化。也就是說,如下程式碼

int games = 198;
double talk = 2.73;

轉化為

int games (198);
double talk (2.73);