[英]Initializer list vs. initialization method
至少有兩種方法可以在C ++中初始化一個類。
(1)初始化列表
struct C
{
int i;
C() : i(0) {}
};
(2)初始化方法
struct D
{
int i;
C() { init(); }
void init() {
i = 0;
}
};
我需要不時地重新啟動我班級的對象。 使用第二個解決方案,我可以簡單地調用obj.init()
。 使用第一個解決方案,我要么必須添加一個init()
函數,它基本上復制了初始化列表效果或使用obj = C()
。
對於哪種變體在這里更好,是否存在或多或少的共識? 使用初始化方法是否有缺點(除了C ++ FAQ中提到的可能的性能損失)。
主要區別在於,如果不使用初始化列表,則會創建成員,然后為其分配值。 使用初始化列表時,可以使用給定值直接創建成員。
在使用初始化時,其中一種情況很重要,就是當您的類將某些引用作為成員保存時,有必要在構造它們時正確初始化這些成員:
class A
{
public:
A(B& bRef) : bRef_(bRef) { }
private:
B& bRef_;
}
這個問題也可以幫到你: 在這個特定的情況下,使用成員初始化列表和在構造函數中賦值是否有區別?
你的init()
方法非常好。 正如您自己提到的那樣,您希望初始化這些成員的次數多於第一次構造此類實例的時間,因此為了可重用性和簡單性,將其保留在方法中是正確的。 除非您確實需要,否則不要嘗試提高代碼的性能。
有人說, 快速制作正確的程序比制作快速程序更容易。 ;)
在創建數組(使用向量或使用new
動態分配)時,您必須在使用構造函數時在其每個成員上顯式調用init
,它將自動為所有元素調用。
我更喜歡將基本初始化放入構造函數中,將更復雜的邏輯放入init方法中。 在我看來,構造函數不應該執行任何復雜的操作。
以下是使用初始化程序列表時的方案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.