2009-04-09 42 views
3

我最初寫一些像這樣的代碼:C++空白paren成員初始化 - 清零內存?

class Foo 
{ 
public: 
    Foo() : m_buffer() 
    {} 

private: 
    char m_buffer[1024]; 
}; 

有人誰比我說,具有m_buffer()初始化將零出內存更聰明。我的意圖是讓內存不被初始化。我沒有時間進一步討論,但它激起了我的好奇心。

以前,我曾經認爲總是在初始化列表中列出每個成員是明智的。

請問有人可以進一步描述這種行爲嗎?

1)爲什麼空白初始值設定項填充內存?

2)它只適用於POD數據類型嗎?我聽說它是​​如此,但沒有標準的方便。

感謝

+0

「以這種方式行事」。哪一條路?請澄清。 – 2009-04-09 16:42:19

+0

完成 - 我指的是內存填充 – 2009-04-09 16:48:25

回答

11

如果您有一個如此初始化的成員,它將是value-initialized。對於POD也是如此。對於一個結構體來說,每個成員都以這種方式進行了值初始化,而對於一個數組,其每個元素都進行了值初始化。

對於標量類型(如指針或整數)的值初始化,您將它初始化爲0,並將其轉換爲正確的類型。所以你會得到空指針或者虛假或者具體的類型。

請注意,該規則從C++ 98微妙地改變爲C++ 03(我們現在有),這可能會有令人驚訝的效果。 C++ 98沒有那個value-initialization。它表示默認的初始化發生,對於非POD類型,這始終意味着它是默認的構造函數調用。但是,如果沒有用戶聲明的構造函數,則C++ 03中的value-initialization具有特殊含義:然後,每個元素都進行了值初始化。

這裏的區別是:現在

struct A { int c; ~A() { } }; // non-POD, but no user declared ctor 
struct B { A a; B():a(){ } } b; 

,在C++ 03,你將保證b.a.c爲零。而在C++ 98中,b.a.c將有一些未確定的值。

1

以前,我曾認爲這是明智的 總是列出在 初始化列表中的每個成員。

這是爲了確保所有的成員都被初始化。

要解決您的任務,只需從初始化程序列表中刪除m_buffer即可。

template <typename T> 
struct C 
{ 
    C(): 
     buff(), 
     var(), 
     object() 
    { 
    } 
    T buff[128]; 
    T var; 
    std::string object; 
}; 

無論使用T()的T類型是默認的構造函數。對於int,chars等,它是0,對於數組,它是{T()}。對於類,它只是它們的默認構造函數。