Подтвердить что ты не робот

Инициализация по умолчанию для массивов элементов С++?

Это простой вопрос, но я не могу найти окончательного ответа.

Если у нас есть следующий класс:

class Test
{
...
  char testArray[10];

...
}; 

Когда мы создаем экземпляр Test, каково значение по умолчанию testArray [1]?

Если это был локальный массив, он был бы неинициализирован. Если это был статический массив, он был бы инициализирован 0.

Что он делает, когда массив является членом класса?

4b9b3361

Ответ 1

Из стандарта, раздел 8.5 [dcl.init]:

Для инициализации объекта типа T по умолчанию:

  • если T является классом класса (возможно, cv-qualit) (раздел 9), вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного значения по умолчанию конструктор);

  • , если T - тип массива, каждый элемент инициализируется по умолчанию;

  • в противном случае инициализация не выполняется.

также раздел 12.6.2 [class.base.init]:

В конструкторе без делегирования, если данный нестатический элемент данных или базовый класс не обозначен идентификатором mem-initializer (включая случай, когда нет списка mem-initializer, поскольку конструктор не имеет ctor -initializer), и сущность не является виртуальным базовым классом абстрактного класса (10.4), то

  • если объект является нестатическим членом данных, у которого есть инициализатор скобок или равный, объект инициализируется, как указано в 8.5;
  • в противном случае, если объект является вариантом (9.5), инициализация не выполняется;
  • в противном случае объект инициализируется по умолчанию (8.5).

Итак, поскольку тип элемента char, когда каждый элемент инициализируется по умолчанию, инициализация не выполняется. Содержимое осталось с произвольными значениями.

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

Ответ 2

Это зависит от возможных факторов, о которых вы забыли упомянуть.

Если ваш Test не имеет определенного пользователем конструктора или ваш пользовательский конструктор не прилагает никаких усилий для инициализации массива, и вы объявляете объект типа Test как

Test test; // no initializer supplied

то он будет вести себя точно так же, как описано выше. Для автоматического (локального) объекта содержимое массива останется непредсказуемым. Для статического объекта гарантируется, что содержимое будет равно нулю.

Если ваш класс имеет определяемый пользователем конструктор, он будет зависеть от того, что делает конструктор. Опять же, имейте в виду, что статические объекты всегда инициализируются нулем, прежде чем любой конструктор сможет что-либо сделать.

Если ваш класс является агрегатом, содержимое может зависеть от инициализатора агрегата, который вы указали в объявлении объекта. Например

Test test = {};

будет инициализировать нулевой массив даже для автоматического (локального) объекта.

Ответ 3

Я считаю, что если вы не инициализируете его, когда вы его объявляете, он может быть настроен на что угодно. Иногда это адрес или случайное значение.

Лучшей практикой является инициализация после объявления.