Test *t;
должно инициализировать x значением 5.
Это ложь. Эта строка кода просто объявляет указатель на Test
. Нет объекта Test
, поэтому не запускается конструктор, который инициализирует любые x
значением 5.
Выполнение t->x
является неопределенным поведением, потому что нет объекта для разыменования. Программа может делать что угодно, в том числе выводить значение мусора.
Чтобы указать t
на объект Test
, вам нужно выделить память или указать на существующий объект Test
:
Test *t = new Test{};
// or
Test a;
Test *t = &a;
и теперь выполнение t->x
гарантированно даст значение 5.