簡體   English   中英

初始化列表與初始化方法

[英]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方法中。 在我看來,構造函數不應該執行任何復雜的操作。

以下是使用初始化程序列表時的方案:

  • 用於初始化非靜態const數據成員。
  • 用於初始化參考成員。
  • 用於初始化沒有默認構造函數的成員對象。
  • 用於初始化基類成員。
  • 當構造函數的參數名稱與數據成員相同時。
  • 出於性能原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM