Давайте станем педантичными, потому что есть различия, которые могут реально повлиять на поведение вашего кода. Многое из следующего взято из комментариев, сделанных к статье "Старое новое" .
Иногда память, возвращаемая новым оператором, будет инициализирована, и иногда это не будет зависеть от того, является ли тип, который вы обновляете, POD (обычные старые данные) или если класс, который содержит члены POD и использует сгенерированный компилятором конструктор по умолчанию.
- В C ++ 1998 есть 2 типа инициализации: ноль и по умолчанию
- В C ++ 2003 был добавлен третий тип инициализации, инициализация значения.
Предположим:
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
В компиляторе C ++ 98 должно происходить следующее:
new A
- неопределенное значение
new A()
- инициализация нуля
new B
- конструкция по умолчанию (B :: m неинициализирована)
new B()
- конструкция по умолчанию (B :: m неинициализирована)
new C
- конструкция по умолчанию (C :: m инициализируется нулями)
new C()
- конструкция по умолчанию (C :: m инициализируется нулями)
В компиляторе, совместимом с C ++ 03, все должно работать так:
new A
- неопределенное значение
new A()
- инициализация значения A, то есть инициализация с нуля, поскольку это POD.
new B
- инициализируется по умолчанию (оставляет B :: m неинициализированным)
new B()
- инициализирует значение B, которое инициализирует нулями все поля, поскольку его ctor по умолчанию генерируется компилятором, а не определяется пользователем.
new C
- инициализирует по умолчанию C, который вызывает ctor по умолчанию.
new C()
- инициализирует значение C, которое вызывает ctor по умолчанию.
Так что во всех версиях C ++ есть разница между new A
и new A()
, потому что A - это POD.
И есть разница в поведении между C ++ 98 и C ++ 03 для случая new B()
.
Это один из пыльных уголков C ++, который может свести вас с ума. При создании объекта иногда вам нужны / нужны парены, иногда вы совершенно не можете их получить, а иногда это не имеет значения.