Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 24. Массивы объектов класса



5.5.5 Массивы объектов класса

 Чтобы можно было описать массив объектов класса с конструктором,
 этот класс должен иметь стандартный конструктор, т.е. конструктор,
 вызываемый без параметров. Например, в соответствии с определением

          table tbl[10];

 будет создан массив из 10 таблиц, каждая из которых инициализируется
 вызовом table::table(15), поскольку вызов table::table() будет
 происходить с фактическим параметром 15.
     В описании массива объектов не предусмотрено возможности указать
 параметры для конструктора. Если члены массива обязательно надо
 инициализировать разными значениями, то начинаются трюки с
 глобальными или статическими членами.
     Когда уничтожается массив, деструктор должен вызываться для
 каждого элемента массива. Для массивов, которые размещаются не
 с помощью new, это делается неявно. Однако для размещенных в свободной
 памяти массивов неявно вызывать деструктор нельзя, поскольку транслятор
 не отличит указатель на отдельный объект массива от указателя на начало
 массива, например:

          void f()
          {
            table* t1 = new table;
            table* t2 = new table[10];
            delete t1;  // удаляется одна таблица
            delete t2;  // неприятность:
                        // на самом деле удаляется 10 таблиц
          }

 В данном случае программист должен указать, что t2 - указатель
 на массив:

          void g(int sz)
          {
            table* t1 = new table;
            table* t2 = new table[sz];
            delete t1;
            delete[] t2;
          }

    Функция размещения хранит число элементов для каждого размещаемого
 массива. Требование использовать для удаления массивов только операцию
 delete[] освобождает функцию размещения от обязанности хранить счетчики
 числа элементов для каждого массива. Исполнение такой обязанности в
 реализациях С++ вызывало бы существенные потери времени и памяти
 и нарушило совместимость с С.

 
« Предыдущая статья   Следующая статья »