T()
является примером значения инициализации . И он ведет себя по-разному в зависимости от того, что именно T
. Непосредственные категории следующие:
Эффект инициализации значения:
, если T является типом класса без конструктора по умолчанию или с пользователем-предоставленный или удаленный конструктор по умолчанию, объект является инициализированным по умолчанию ;
, если T является типом класса с конструктором по умолчанию, который не является нипредоставленный пользователем или удаленный (то есть это может быть класс с неявно определенным или дефолтным конструктором по умолчанию), объект является инициализируемым нулями и затем это инициализированный по умолчанию , если он имеет нетривиальный конструктор по умолчанию;
, если T является типом массива, каждый элемент массива инициализируется значением ;
в противном случае объект инициализируется нулями .
"инициализация по умолчанию" и "ноль"инициализация "сами по себе являются терминами с точным значением, которое должно быть определено для точного типаг использовал. В конечном счете, инициализация в C ++ является чем-то вроде кроличьей норы. Я верю, что нет необходимости объяснять, что означает «инициализация нуля», это просто установка значения объекта на соответствующий ноль. Что касается «инициализации по умолчанию», она определяется следующим образом:
Эффекты инициализации по умолчанию:
, если T является типом класса, конструкторы считаютсяи подвергнут разрешению перегрузки против пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;
, если T является типом массива, каждый элемент массива по умолчанию-initialized;
в противном случае ничего не делается: объекты с автоматической продолжительностью хранения (и их подобъекты) инициализируются неопределенными значениями.
Теперь назовем пару примеров:
int()
- Следуя пунктам списка выше, мы инициализируем int
как 0
. std::string()
- вызывает конструктор по умолчанию std::string
, в результате чего получается пустая строка.