По сути, всякий раз, когда вы объявляете переменную, компилятор вызывает ее конструктор по умолчанию, если вы не укажете иначе.
Типы уровня языка (например, указатели, 'int', 'float', 'bool' и т. Д.) "Конструктор по умолчанию" абсолютно ничего не делает, он просто оставляет память такой, какой она есть, когда она объявлена (глобальные / статические переменные в особых случаях см. ответ chubsdad для получения дополнительной информации). Это означает, что они могут быть в значительной степени чем угодно, потому что вы обычно не можете быть уверены, что было в этой памяти ранее или даже откуда она взялась (за исключением случая оператора размещения нового).
У созданного вами класса нет конструкторов, поэтому компилятор сгенерирует для вас конструктор по умолчанию, который просто вызывает конструктор каждого из его членов / переменных. Если вы включите информацию, представленную в предыдущем абзаце, вы увидите, что для переменной 'x' будет вызываться конструктор по умолчанию, который ничего не делает и, следовательно, не инициализируется каким-либо значением.
Как уже говорили другие, в вашем коде или указателях нет ссылок, поэтому термин «NULL» здесь недопустим во всех случаях. NULL обычно относится к указателю, который, как и другие типы уровня языка, не устанавливается ни к чему, пока вы не назначите ему значение (если, конечно, это не глобальная / статическая переменная).