——調用構造函數時,對象將在括弧中的代碼執行前被創建,因此無法在括弧內初始化對象的常量成員。 Queue::Queue(int qs) { front = rear = NULL; items = 0; qsize =qs; // not acceptable! qsize是一個常量成員 } 因此C ...
——調用構造函數時,對象將在括弧中的代碼執行前被創建,因此無法在括弧內初始化對象的常量成員。
Queue::Queue(int qs) { front = rear = NULL; items = 0; qsize =qs; // not acceptable! qsize是一個常量成員 }
因此C++提供了一種特殊的語法來完成上述工作——成員初始化列表
它是什麼樣子:
- 由逗號分隔的初始化列表組成(前面帶冒號)。
- 位於參數列表的右括弧之後、函數體左括弧之前。
- 如果數據成員的名稱為mdata,並需要將它初始化為val,則初始化器為mdata(val)。
1 Queue::Queue(int qs) : qsize(qs), items(0) // initialize qsize to qs, 0 to items 2 { 3 front = rear = NULL; 4 }
初值可以是常量或構造函數的參數列表中的參數,並且初始化並不只限定用於常量
何時使用:
- 只有構造函數可以使用種初始化列表語法,不能將成員初始化列表用於構造函數之外的其它類方法
- 對於本身就是類對象的成員來說,使用成員初始化列表的效率更高(直接調用複製構造函數,代替了調用預設複製構造函數再操作對象(使用賦值運算符賦值等)的步驟)
- 非靜態const成員必須使用這種語法(在C++11之前)
- 被聲明為引用的類成員必須使用這種語法
特點
- 數據成員被初始化的順序於它們出現在類聲明中的順序相同,與初始化器中的排列順序無關
- 成員初始化列表使用的括弧方式也可用於常規初始化
- 即可將
int games = 162; double talk = 2.17828;
替換為
int games(162); double talk(2.17828);
- 即可將
C++11:
——C++11允許以更直觀的方式進行初始化(非靜態const成員,非靜態成員):
class Classy { int mem1 = 10; // in-class initialization const int mem2 = 20; // in-class initialization ... };
如果調用了使用成員初始化列表的構造函數,在這種情況下,實際列表將覆蓋這些預設初始值