#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. Да, действительно, это рекурсивно применяется к структурам и массивам подобных вещей!