天天看點

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之前

繼續閱讀