Нулевая инициализация

1,00
р.
В каких случаях происходит инициализация нулями и в каких нет?

Ответ
Инициализация нулями (zero-initialization) применяется в трех случаях:
1) Переменные со статическим и потоковым временем хранения (static/thread storage duration), перед тем как для них производится любая другая инициализация. Сюда входят переменные, объявленные с помощью ключевых слов thread_local, static, а также глобальные переменные.
thread_local int a int b struct S { void f() { static int c } static int d } int S::d
2) При инициализации значением (value-initialization), если тип не является классом (class или struct), и не является массивом.
union U { int a float b } void f(int, U)
f(int(), U())
3) Элементы массива char, для которых нет инициализаторов:
char a[5] = "123" // a[3] и a[4] будут использованы нулями.
Более подробно можно прочитать на cppreference.