——呼叫建構式時,物件將在括號中的代碼執行前被創建,因此無法在括號內初始化物件的常量成員,
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
...
};
如果呼叫了使用成員初始化串列的建構式,在這種情況下,實際串列將覆寫這些默認初始值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/9937.html
標籤:C++
下一篇:C++ 偽私有方法
