是什麼 - visual studio c++下載




成員結構是否可以從構造函數初始化列表中歸零,而無需調用memset? (2)

它相當於float foo = float();

即使值表示不是全位 - 零,它也會使對象歸零。 即它甚至比memset()更好。

假設我有以下結構聲明(沒有構造函數的簡單結構)。

struct Foo
{
    int x;
    int y;
    int z;
    char szData[DATA_SIZE];
};

現在讓我們說這個結構是C ++類的成員,如下所示:

class CFoobar
{
     Foo _foo;
public:
     CFoobar();
};

如果我聲明CFoobar的構造函數如下:

CFoobar::CFoobar()
{
    printf("_foo = {%d, %d, %d}\n", _foo.x, _foo.y,_foo.z);
    for (int x = 0; x < 100; x++)
       printf("%d\n", _foo.szData[x]);
}

正如您所料,當CFoobar的構造函數運行時,垃圾數據被打印出來顯然,簡單的解決方法是memset或ZeroMemory&_foo。 這就是我一直以來所做的......

但是,我注意到如果將_foo添加到構造函數的初始化列表中而沒有參數,如下所示:

CFoobar::CFoobar()
: _foo()
{

這似乎將_foo的成員變量清零。 至少在Linux上用g ++就是這種情況。

現在這裡是我的問題:這是標準的C ++,還是這個編譯器的特定行為?

如果這是標準行為,有人可以引用我的官方來源參考嗎? 關於更複雜的結構和類的隱式零初始化行為的任何“陷阱”?


我發現很難閱讀標準,但我發現它我認為:

對T類型的對象進行值初始化意味著:
如果T是沒有用戶聲明的構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都是值初始化的。這樣的類對象的值初始化可以通過零初始化來實現。對象,然後調用默認構造函數。

第8.5節





visual-c++