構造函數與析構函數的注意點

1.構造函數和析構函數裏不該調用虛函數數組

虛函數的多態是經過虛表和虛指針實現。虛表和虛指針是在基類和派生類初始化時逐層完善和創建。每一個類均有本身的虛表和虛指針。因此在基類構造函數裏的虛表和虛指針是不完善的,調用虛函數會產生意外的結果。函數

虛函數實現了晚綁定, 析構是從最外層(晚派生)向最裏層(早派生)進行析構,若是析構函數裏使用虛機制,則有可能綁定到一個比當前須要析構的派生層次更晚派生的一個層次的方法上,而這一層次,已經被析構掉了,這就會出現異常。因此C++編譯器忽略析構函數中使用的虛機制。指針

2.構造函數的初始化列表最好是完整的成員變量列表,且類類型成員變量最好放在初始化列表。對象

成員變量的初始化順序與聲明次序有關,與初始化列表順序無關。內置類型的成員變量在初始化列表裏初始化和在構造函數體裏初始化的效率是一致的。類類型的成員變量在初始化列表裏初始化,纔是真正的初始化,在構造函數體裏僅僅是賦值。若在構造函數體裏對類類型的成員變量賦值,實際上構造函數先是在執行初始化列表時先調用該類類型的默認構造函數進行初始化後,再在構造函數體裏再次賦值。編譯器

3.若類具備派生類,則析構函數最好爲虛函數,不然在父類指針(實際指向子類對象)析構時將不會調用子類的析構函數。編譯

4.不用父類指針來釋放子類對象數組。效率

由於數組是根據實際類型的大小進行偏移。若用父類指針來釋放子類對象數組則,會認爲該數組爲父類類型對象數組,這樣就會在第二個元素釋放時產生錯誤,由於偏移量不對。變量

相關文章
相關標籤/搜索