2014-05-02 89 views
3

我讀過這個問題「C++ Abstract Class: constructor yes or no?」和屬於它的答案。C++中的抽象類和構造函數

但根據回答,我知道我們需要構造函數來初始化它的數據成員,但是我可以使用它的成員函數,如我的派生類初始化數據成員,所以爲什麼它很重要定義一個構造函數?

+5

構造函數(如果調用)可以保證對象的正確初始狀態。安裝程序可能永遠不會被調用? – StuartLC

回答

2

默認的構造函數定義和成員初始化使關於適當的設置條件(有效狀態)的類自包含
使用setter方法來操作類實例對於類客戶端是可選的(包括繼承類)。

您可能會考慮添加更多構造函數簽名,客戶端可以使用一次調用初始化類成員,並且不要求這些應用額外的setter調用。

這取決於具體的用例,最後更方便和語義正確。

+0

是的,添加更多的構造函數簽名對於客戶端是有用的,如果他們要創建對象,但是在抽象類沒有辦法創建對象的情況下。 –

+0

@M_E抽象類意圖被繼承,所以你在困擾什麼?如果你想擁有純粹的抽象接口,不要引入數據成員(而是虛擬的getter/setter方法)! –

+2

@M_E:派生的構造函數_can和does_調用純虛擬基類的構造函數。總是。 –

1

兩個原因:

  1. 爲了確保對象總是在一個有效的狀態。
  2. 您需要一個複製構造函數來確保數據得到正確複製(例如,沒有動態分配資源的盲目副本)。

可能更多。