類方法-成員初始化列表
首先理解建立物件與呼叫建構函式的過程。呼叫建構函式時,物件將在括號中的程式碼執行之前被建立。也就是說先創建出物件,然後再進入建構函式的花括號執行語句。
假設有一個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);