2010-11-27 49 views
8

可能重複:
Benefits of Initialization lists使用初始化列表的優點?

我在想,如果有一個優勢,初始化成員初始化列表上把這些在構造函數中。某些事情必須使用初始化列表,但對於大多數不需要的事情,是否有區別?我更喜歡後者,因爲當我有多個構造函數時,我更喜歡簡單地調用construct()來促進代碼重用。

感謝

回答

12

如果您不使用初始化程序列表,則成員或基類會在打開大括號之前構造默認值。

因此,稍後設置它的呼叫將添加一個operator=()呼叫。

如果使用初始化列表,則成員或基類具有正確的構造函數。

根據您的課程,這可能是必需的或更快。

10

對於原語,有使用初始化列表或者通過分配構造它們之間沒有什麼區別。

對於其他類型,構造對象時,初始值設定項列表可能會提高性能。

請注意,初始化(在初始化程序列表中)的順序取決於類中聲明的順序。如果聲明失靈,並且需要構造依賴於其他已經在手動初始化的其他數據的數據,那麼這是'在可能的規則時使用初始化列表'的例外情況。

更多信息:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

+0

優秀的答案。我想添加一點......它可能是有意義的(根據您擁有的構造函數的數量)將構造函數的賦值給primatives的那部分放在私有的Init()函數中。這可以防止初始化程序列表中的代碼重複。 – 2013-06-26 01:51:59

+0

@birryree關於參數序列的好處可以請您詳細說明在非基元類型的情況下使用初始化列表的優點。 – 2014-03-12 07:27:35

1

除了被迫使用常量或引用初始化列表,它也很有用,因爲有了它,你避免默認結構構件對象的構造函數輸入,然後立即分配給它,以前這如果成員對象的構造成本很高,則可能效率不高

2

除了其他人提到的,它允許消除陰影變量的歧義,所以在哪裏寫this->var = var你可以改爲做myclass(int var) : var(var)。當然,如果你有一個很大的構造函數,有些人可能會覺得這很混亂/難以閱讀。

2

另外,從不在執行初始化列表中執行非託管資源獲取。換句話說,要麼使用「資源獲取是初始化」(從而完全避免非託管資源),要麼在構造函數體中執行資源獲取。

並且警告#2 在其自己的代碼語句中執行每個資源分配(例如新),其立即將新資源賦予管理器對象(例如,auto_ptr)。

http://www.gotw.ca/gotw/056.htm