本文是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之前