    10:	TTime(8,   1), 
    11:	TTime(8,   1,  1996), 
    12:	TTime(8,   1,  1996,  8), 
    13:	TTime(8,   1,   1996,   8,   30) 
    14:	}; 
    15:	for (int i = 0;   i < 6;   i++) 
    16:	   tarray[i].Display() ;
    17:	return 0; 
    18:        }

    В строках 7-14, как и в OBARRAY1.CPP, объявляется массив из шести объектов 
TTime. Конечно, в данном случае объекты массива инициализируются 
конструкторами, указанными в скобках, аналогично тому, как мы инициализировали 
массив структур. В строке 8 инициализируется объект tarray[0] с помощью вызова 
конструктора по умолчанию TTime. В строках 9-13 инициализируются остальные 
объекты массива путем вызова перегруженных конструкторов. 
    Нет простого способа инициализировать одни массивы объектов класса с 
помощью конструктора по умолчанию, а другие с помощью альтернативного 
конструктора. Если у вас возникла такая необходимость, вероятно, лучше 
объявить массив, как в OBARRAY1, а затем инициализировать заново значения 
нужных объектов требуемым образом. Прием, продемонстрированный в OBARRAY2, 
слишком громоздкий для широкого применения на практике за исключением 
небольших по размеру массивов. 
    Массивы объектов классов могут также размещаться в куче и адресоваться с 
помощью указателей. В этом случае для работы с массивом необходимо предпринять 
некоторые дополнительные предосторожности. В листинге 13.24 поясняется эта 
мысль. Скомпилируйте программу, как вы это уже делали с OB ARRAY 1. 

    Иистинг 13.24.   OBARRAY3.CPP (поддержка динамических массивов объектов класса)	-is. 

    1:	#include	<iostream.h> 
    2:	#include	<stdio.h> 
    3:	#include	"time5.h" 
    5;	main() 
    6:	{ 
    7:	  TTime *tarrayP; 
    9:	  tarrayP = new TTime[6]; // Создание динамического массива 
    10:	  for (int 1=0; i < 6; i++) 
    11:	    tarrayP[i].Display(); 
    12:	  delete[] tarrayP; // Обратите внимание на особую форму delete[] 
    13:	  return 0;     
    14:	} 

    В строке 7 объявляется tarrayP в качестве указателя на объект класса 
TTime. Для инициализации указателя в строке 9 вызывается new, выделяющий в 
куче массив из шести объектов TTime с присваиванием tarrayP адреса первого 
объекта массива. В связи с обращением к new C++ шесть раз автоматически 
вызывает конструктор по умолчанию класса TTime для инициализации каждого 
объекта в массиве. 
    Как и в случае с другими динамическими объектами, вы должны удалить 
динамический массив объектов класса по завершении его использования. Конечно, 
удаление подобных массивов вызывает проблемы. Из-за неспособности С и C++ 
различать указатели и массивы программы должны использовать особую форму 
оператора delete[] для обеспечения вызова всех деструкторов при удалении 
динамического массива объектов класса надлежащим образом. Если бы строка 12 в 
OBARRAY3 была написана как 

    delete tarrayP;	// ??? 

то компилятор не смог бы узнать, на что ссылается tarrayP — на один объект 
класса TTime или на массив объектов. Для указания компилятору, что tarrayP 
ссылается на массив, следует добавить пустые скобки к delete: 

    delete[] tarrayP;         // Удаление массива объектов класса TTime. 

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

    ЗАМЕЧАНИЕ 

    В прошлых версиях C++ необходимо было указывать число элементов в 
удаляемом массиве объектов класса и вам пришлось бы использовать операторы 
вида delete[6] tarrayP для удаления массива из шести объектов класса TTime, на 
который ссылается tarrayP Применение этого приема ныне не допускается, и 
Borland C++ игнорирует любые значения внутри скобок delete[] Если вы укажете 
размер массива в скобках, компилятор выдаст вам предупреждение "Array size for 
'delete' ignored in function x<)" (Размер массива для delete проигнорирован в 
функции х()).


    Глава 13. Программирование классов 333 
