Не так сложно:
A x;
A * p = new A;
Это две инициализация по умолчанию . Поскольку у вас нет пользовательского конструктора, это просто означает, что все члены инициализируются по умолчанию. Инициализация по умолчанию для базового типа, такого как int
, означает «без инициализации».
Далее:
A * p = new A();
Это значение инициализации . (Я не думаю, что существует автоматическая версия этого в C ++ 98/03, хотя в C ++ 11 вы можете сказать A x{};
, и эта скобка-инициализация становится инициализацией значения. Кроме того, A x = A();
достаточно близок практически, несмотря на то, что copy-initialization или A x((A()))
, несмотря на то, что direct-initialization .)
Опять же, в вашем случае это просто означает, что все члены инициализированы значением. Инициализация значения для фундаментальных типов означает инициализация нуля , что, в свою очередь, означает, что переменные инициализируются нулем (что имеют все фундаментальные типы).
Для объектов типа класса инициализация по умолчанию и инициализация значения вызывают конструктор по умолчанию. Что произойдет затем, зависит от списка инициализатора конструктора, и игра продолжается рекурсивно для переменных-членов.