Допустим, у меня есть следующее объявление структуры (простая структура без конструктора).
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. По крайней мере, так было в случае с g ++ в linux.
Теперь вот мой вопрос: это стандарт C ++ или специфическое поведение этого компилятора?
Если это стандартное поведение, может кто-нибудь процитировать мне ссылку из официального источника? Какие-нибудь "ошибки" в отношении неявного поведения с нулевой инициализацией с более сложными структурами и классами?