C++對象模型(四):class成員初始化列表(Member Initialization List)
本文是Inside C++ Object Model Chapter 2 部分的讀書筆記。
編譯器如何處理初始化成員列表的。
下列情況中,必須要使用member initialization list進行data member 的初始化:
1) 當初始化一個reference member。
2) 當初始化一個const member。
3) 當調用一個base class 的constructor,而他擁有一組參數的時候。
4) 調用一個member class 的constructor ,而他有一組參數。
編譯器會一一操作初始化列表的成員,以適當的順序在class的constructor中插入初始化操作,並且保證它們都發生在任何explicit user code 之前。
這裏總的需要留意兩點:
第一個:member object的初始化,最好放到初始化列表裏麵。若放置於構造器中,則會產生臨時的object0,初始化之,在做賦值運算給object,然後object0自行銷毀,期間耗時耗力。若置於初始化列表,則編譯器會在構造函數中,user code之前,調用object的構造函數,予以初始化。
第二個:初始化列表的初始化次序。初始化次序和member在類中的聲明次序一致。相互關聯的member,需要十分留意初始化列表中,其中依賴的次序。解決的辦法:把其中一部分使用初始化列表初始化,而另一部分放置到構造函數中使用user code予以表達,這樣即便次序存在依賴,也會隻“先執行合成的,再執行user的code”。
總結:
編譯器會對initialization list一一處理並且可能重新排序:按照members的聲明順序。它會安插一些代碼到constructor內,並且在explicit user code之前
最後更新:2017-04-03 12:53:42