C Добавление объектов, имеющих конструкторы, в массив

#c #arrays #object

#c #массивы #объект

Вопрос:

Когда я объявляю массив, объявляются все переменные / объекты. Но что происходит с объектами, если их класс имеет конструкторы? Класс, который я использую, имеет 2 конструктора — один без аргументов и один с несколькими аргументами. Активируется ли первый конструктор после объявления? Или конструкторы не будут активированы?

Если произойдет первый случай, мне придется создать функцию, которая заменяет конструкторы.

Итак, что происходит с объектами во вновь объявленном массиве?

Ответ №1:

Это зависит от того, как вы объявляете массив. Элементы будут либо по умолчанию, либо по значению, либо инициализированы копией:

 Foo x[] = { Foo(1), Foo(true, 'a'), Foo() };  // copy-initialize
Foo x[3] = { };                               // value-initialize
Foo x[3];                                     // default-initialize
  

Для типов классов инициализация по умолчанию и значением вызывает конструктор по умолчанию. Инициализация копирования может вызвать соответствующий конструктор напрямую.

Если вы не хотите использовать конструктор по умолчанию, вы не сможете обойти инициализатор в виде фигурных скобок и прописать каждый элемент.

Комментарии:

1. Вы имеете в виду Foo x[] = { new Foo(1), …} ?

2. @ThanhNguyen: для этого потребовался бы Foo(Foo *) конструктор и это вызвало бы утечку памяти, если бы у этого конструктора не было delete своего аргумента (что было бы очень плохим стилем).

3. @ThanhNguyen: Нет, я имею в виду Foo x[] = { Foo(1) }; . Я мог бы также сказать Foo x[] = { 1 }; , но это немного другое — для этого требуется конструктор с одним аргументом, а также конструктор неявного копирования. C 11 делает это немного более гибким, также позволяя Foo x[] = { {true, 'a'} }; , хотя нам снова нужен доступный конструктор неявного копирования.

Ответ №2:

Массивы будут вызывать конструкторы по умолчанию для всех объектов, если базовый тип имеет нетривиальный конструктор по умолчанию.

Я точно не помню правила, но целые числа, символы, структуры, все члены которых имеют тривиальные конструкторы и т.д., Все имеют тривиальные конструкторы по умолчанию. Массивы этих объектов (и массивы массивов этих объектов и т.д.) Не будут инициализированы, если вы не сделаете этого явно.

Явно объявленный конструктор по умолчанию никогда не бывает тривиальным, поэтому объекты Foo в вашем массиве будут сконструированы по умолчанию.

Комментарии:

1. Я думаю, вы имеете в виду инициализацию основных типов по умолчанию в последнем абзаце, которая действительно оставляет переменные неинициализированными.

2. @KerrekSB: Нет, не только фундаментальные типы. Структуры, объединения, структуры массивов структур и т.д. Могут иметь тривиальные конструкторы по умолчанию.

3. Да, действительно, это рекурсивно применяется к структурам и массивам подобных вещей!