Что означает «инициализация значения»?

Возможный дубликат:
Что означают следующие фразы в C ++: инициализация нуля, значения по умолчанию и значения?

Если у меня есть класс, например:

class Info
{
   int x;
   int y;
};

который я использовал для создания объекта,

Info *p = new Info();

Означают ли скобки рядом с информацией о том, что я ценю ее инициализацию? Чем он отличается от этого, Info *p = new Info;?

Я знаю, что существует вопрос, который различает разные значения в новом и старом языке C ++, но я хочу знать семантическую разницу между инициализацией по умолчанию и инициализацией значения, например Означает ли инициализация значения обнуление чего-либо?


person user1086635    schedule 14.01.2012    source источник


Ответы (1)


Объявленная переменная может быть инициализирована нулевым значением, инициализированным значением или инициализированной по умолчанию.

В вашем примере:

Info *p = new Info();    <------- Value Initialization
Info *p = new Info;      <------- Default Initialization

Стандарт C ++ 03 8.5 / 5 точно определяет каждый:

Чтобы обнулить объект типа T, необходимо:

- если T является скалярным типом (3.9), объекту присваивается значение 0 (ноль), преобразованное в T;
- если T не является типом класса объединения, каждый нестатический член данных и каждый базовый класс подобъект
инициализируется нулем;
- если T является типом объединения, первый именованный член данных объекта инициализируется нулем;
- если T является типом массива, каждый элемент инициализируется нулем; < br> - если T - ссылочный тип, инициализация не выполняется.

Чтобы инициализировать по умолчанию объект типа T означает:
- если T не является типом класса POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация неудачна) формируется, если T не имеет доступного конструктора по умолчанию);
- если T является типом массива, каждый элемент инициализируется по умолчанию;
- в противном случае объект инициализируется нулем.

Чтобы инициализировать значение объект типа T означает:
- если T является типом класса (пункт 9) с конструктором, объявленным пользователем (12.1), то вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);
- если T не является типом класса Union без конструктора, объявленного пользователем, то каждый нестатический член данных и компонент базового класса T инициализируется значением;
- если T является типом массива, то каждый элемент инициализируется значением;
- в противном случае объект инициализируется нулем

person Alok Save    schedule 14.01.2012
comment
В моем случае класс Info является типом класса POD. Означает ли это, что инициализация по умолчанию будет нулевой? - person user1086635; 14.01.2012
comment
@ user1086635: Да. Это четко указано во втором абзаце Стандартной цитаты выше. - person Alok Save; 14.01.2012
comment
Этот ответ недействителен для чего-либо более позднего, чем C ++ 03. См. «Возможный дубликат» для получения обновленного ответа, а также cppreference. - person Lytigas; 02.08.2020
comment
Уточнение по инициализации по умолчанию: согласно cppreference в противном случае должен быть последний маркер, ничего сделано: объекты с автоматическим хранением (и их подобъекты) инициализируются неопределенными значениями. Это то, что позволяет инициализированным по умолчанию скалярам иметь любое значение, а не быть инициализированным нулем. - person ryan0270; 12.11.2020