2012-04-25 17 views
4

有人可以引用一個示例代碼,當我們不應該在構造函數中使用初始化列表以及如何通過賦值來克服這個問題時?什麼時候我們不應該在構造函數中使用初始化列表?

我找了一個例子下面的語句

當你的類有兩個構造函數需要的this對象的數據成員初始化不同的順序可能發生這種情況。或者當兩個數據成員是自我引用時可能發生。或者當一個數據成員需要對這個對象的引用,並且你希望避免編譯器在{{開始構造函數的正文(當你的特定編譯器碰巧發出那個特定警告)之前使用this關鍵字的警告)。或者當你需要在變量(參數,全局等)上進行if/throw測試之前,使用該變量初始化你的這個成員之一。

+2

需要注意的一件事是,初始化順序不是可選的,無論按照哪個順序編寫初始化語句,它都是相同的 – 2012-04-25 21:06:29

+1

您列出了自己的問題的答案,似乎是要求提供樣本?爲什麼?你不瞭解什麼部分? – 2012-04-25 21:08:04

+0

你能否編輯你的問題來添加該語句的作者?換句話說,你是從哪裏來的? – nbro 2016-09-22 20:33:17

回答

2

下面是一些例子:


當你的類有兩個構造函數需要 初始化這個對象的數據成員在不同的順序可能發生這種情況。

class Example1 { 
public: 
    Example1(std::string decoded, std::string encoded) 
     : decoded_(decoded), 
     encoded_(encoded) {} 
    explicit Example1(std::string encoded) 
     : decoded_(), // Can't use "decoded_(Decode())" since "encoded_" isn't initialised 
     encoded_(encoded) { 
    decoded_ = Decode(); // Assign here instead of initialising 
    } 
private: 
    std::string Decode(); // decodes class member "encoded_" 
    std::string decoded_, encoded_; 
}; 

在這個例子中,decoded_總是會encoded_之前,因爲這是它們被類中聲明的順序,即使我們換在初始化列表它們的順序初始化。


或者當一個數據成員需要對這個對象的引用,你 想避免編譯器警告有關使用此關鍵字之前 的{開頭的構造函數的身體(當你的特定編譯器碰巧發出那個特定的警告時)。

class Example2 { 
public: 
    Example2() : functor_() { 
    functor_ = std::bind(&Example2::Do, this); 
    } 
private: 
    void Do(); 
    std::function<void()> functor_; 
}; 

這裏,functor_需要使用this當它被初始化/分配。如果我們要在初始化列表中初始化functor_,那麼this指針將指向在那一點上未完全初始化的對象。這可能是安全的,具體情況取決於具體情況,但萬無一失的選項是推遲設置functor_,直到構造函數體內部,此時this確實引用完全初始化的對象。


或者當你需要在一個變量(參數, 全球等)使用該變量初始化 這個成員之一之前做的,如果/投擲試驗。

class Example3 { 
public: 
    Example3(int force, int acceleration) 
     : force_(force), 
     acceleration_(acceleration), 
     mass_(0) { 
    if (acceleration_ == 0) 
     throw std::exception("Can't divide by 0"); 
    mass_ = force_/acceleration_; 
    } 
private: 
    int force_, acceleration_, mass_; 
}; 

希望這是不言自明的。


我不知道什麼是

當兩個數據成員的自我指涉

,所以我不能給爲我怕一個例子的意思。

+0

@Fraser ....很好的解釋! – 2012-04-25 22:49:32

+0

您能否給本聲明添加引用「在這個例子中,decode_將始終在encoded_之前初始化,因爲即使我們在初始化列表中交換它們的順序,它們在類中聲明的順序也是如此。」? – nbro 2016-09-22 20:40:22

4

我相信你的話的作者指的是主要概念是發生在你看到他們在初始化列表的順序,調用變量所做的初始化列表中的事實,但在order變量列在類別定義中。

這意味着

  • 如果你有使用初始化列表兩種不同的構造函數,它們必須初始化它們以相同的順序
  • 在測序的控制(如果你有這可能是重要的mutually-相關成員)被限制

我建議考慮看看斯科特·邁耶的Effective C++覆蓋這個(以及很多,很多其他有用和informati主題)。

+0

另外,除非它們是內置類型,否則如果不使用初始化list_,則它們將以相同順序初始化_even。 – 2012-04-25 21:09:37

相關問題