Ответ 1
Если A
является POD-типом, тогда new A
будет выделять новый объект A
, но оставьте его с неопределенным значением, иначе new A
по умолчанию будет инициализировать новый объект.
Во всех случаях new A()
будет стоить инициализировать новый объект A
.
Это, очевидно, другое поведение для типов POD, но также влияет на не-POD, типы неединичных классов без конструктора с объявленным объявлением.
например.
struct A
{
int a;
std::string s;
};
A
- тип класса не-POD без конструктора, объявленного пользователем. Когда инициализируется инициализация A
, вызывается неявно определенный конструктор, который вызывает конструктор по умолчанию для s
(не-POD-тип), но A
не инициализируется.
Когда значение A
инициализируется значением, так как оно не имеет конструктора с объявленным объявлением, все его члены инициализируются значением, что означает, что вызывается конструктор по умолчанию для s
и A
инициализируется нулем.
ИСО 14882: 2003 ссылки:
-
5.3.4 [expr.new]/15: Как объекты, выделенные выражением
new
, инициализируются в зависимости от того, опущен ли инициализатор, пара круглых скобок или иначе. -
8.5 [dcl.init]/5: Значение инициализации нуля, инициализация по умолчанию и инициализация значения.
-
12.1 [class.ctor]/7,8: Форма написанного пользователем конструктора, который соответствует поведению неявно определенного конструктора по умолчанию.
-
12.6.2 [class.base.init]/4: Как инициализируются базы и элементы, которые не указаны в списке инициализатора элемента конструктора.