2017-09-05 117 views
1

我已經離開C++一段時間了,我試圖確定定義類的私有成員變量(如果有的話)的這兩個默認構造函數初始化的區別。類定義位於頭文件中,而實現位於單獨的文件中。所有私有成員變量都需要初始化爲「0」或無意義的值。構造函數中私人成員初始化的差異(C++)

注:

int數據[MAX_SIZE]的大小是固定的編譯時間陣列。 int used:是數組的索引跟蹤器。

一般來說,我習慣了通過以下方式初始化成員:

// Default Constructor 
IntSet::IntSet() 
{ 
    data[MAX_SIZE-1] = {0} 
    used = 0; 
} 

我通過一些遺留代碼梳理和尋找一種完全不同的語法:

// Default Constructor 
IntSet::IntSet() : used(0) 
{ 
    data[MAX_SIZE-1] = {0}; 
} 

有最終結果的差異?

+0

在你的第二個片段中使用[初始化程序列表](http://en.cppreference.com/w/cpp/language/initializer_list)。在C++中不允許使用VLA。 – Ron

+0

這裏沒有使用VLA。所做的就是將'data'的最後一個值設置爲0. – user4581301

回答

5

成員在構建時被初始化,之前達到構造函數的主體。有些情況下他們有所不同。例如:

  • 如果一個成員是常量或參考,它必須可以在初始化列表中初始化,並且不能在構造體

  • 如果部件不具有默認的構造進行初始化(或者你沒有訪問它),那麼你必須提供它應該使用一些參數的構造函數,並且只能在初始化器列表中完成。

  • 如果對象「創建並分配給對象是」大而昂貴「,那麼默認情況下可以通過構造對象然後對其使用賦值運算符來做低效率的事情。 (而不是在同一時間與它的初始值構成它。)

對於像您所描述默認結構是微不足道的,因此任何一種方式是等效的整數和原始的,POD類型,鑑於對參考上述限制, const等。

+0

附錄:有關[成員初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list)的更多閱讀內容 – user4581301

+0

感謝解釋和參考其他讀物。真的很感激它!有沒有更好的方法來初始化數組的每個元素爲NULL值,同時也將「used」設置爲「0」? –

+0

@AlexanderMaxwell您無法在構造函數初始值設定項列表中初始化數組。爲此,您必須使用for循環或等效循環來將每個元素初始化爲NULL。 –