Скажем, у меня есть следующее объявление структуры (простая структура без конструктора).
struct Foo
{
int x;
int y;
int z;
char szData[DATA_SIZE];
};
Теперь скажем, что эта структура является членом класса С++ следующим образом:
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.
Теперь вот мой вопрос: Является ли это стандартным С++ или это специфическое поведение для компилятора?
Если это стандартное поведение, может ли кто-нибудь указать мне ссылку из официального источника? Любые "gotchas" в отношении неявного поведения с нулевым init с более сложными структурами и классами?