образом, последующие вызовы GetSTime() будут использовать созданную ранее 
строку. Это сокращает количество выделений пространства в динамически 
распределяемой области памяти для строкового представления даты и времени, 
уменьшает фрагментацию динамически распределяемой области и улучшает 
быстродействие программы. 
    Поскольку объект класса TTime владеет указателем dts, ссылающимся на 
выделенный блок памяти, класс должен аккуратно управлять распределением этой 
памяти. Объект типа TTime не должен выходить из области видимости без 
освобождения выделенной этому объекту памяти, иначе это приведет к ошибкам, 
связанным с нехваткой памяти. Кроме того, если дата и время объекта класса 
TTime изменились (например, с помощью обращения к ChangeTime() и SetTime()), то 
ненулевой указатель dts должен быть удален и установлен равным нулю, таким 
образом он будет выделен заново в следующем вызове GetSTime(). 
    Вернемся к TIME6.H (листинг 13.18) и рассмотрим строку 19, в которой 
объявляется деструктор для класса TTime. Деструкторы обычно объявляются в 
открытой секции класса, но могут и не объявляться вовсе. Класс может иметь не 
более одного деструктора с именем класса, в котором он объявлен (как и все 
конструкторы). Только объявлению деструктора предшествует тильда (~), которая 
используется в математике для обозначения разности. Деструкторы — антиподы 
конструкторов: то, что создано конструктором, может быть уничтожено деструктором. 
    Реализация деструктора ничем не отличается от других функций-членов. Вы 
можете усовершенствовать код, объявив деструктор встраиваемым. В листинге 
13.19 в строках 21-24 приводится реализация деструктора класса TTime: 

    TTime:: ~TTime() 
    { 
       delete dts;  // Удаление строки,   хранящейся в объекте 
    } 

    Так же, как конструкторы и функции-члены, имя деструктора -TTimeO 
предваряется именем класса и оператором разрешения области видимости TTime::, 
что идентифицирует деструктор как член класса ТТшге. Единственный оператор в 
деструкторе TTime удаляет dts. (Можно не проверять dts на содержание 
ненулевого значения; оператор delete проигнорирует нулевые аргументы-указатели.) 
    Если объект класса выходит из области видимости, C++ автоматически 
вызывает деструктор объекта класса, если таковой имеется. Это дает объекту 
удобную возможность для самоочистки, например удаления памяти, выделенной 
конструктором или функцией-членом. 
    Помните: конструкторы создают, деструкторы разрушают. Класс может иметь 
много конструкторов, следовательно, программа может создавать объекты 
различными способами. Конечно, класс может иметь не более одного деструктора, 
который вызывается автоматически при уничтожении объекта Или при выходе его из 
области видимости. Если необходимо по-разному уничтожать объекты, деструктор 
может вызывать функции-члены, использовать оператор switch и другие средства 
для адекватных действий в различных ситуациях. 

    "Жизнь" объекта 

    Объекты класса могут быть глобальными или локальными в функции. Как и 
переменные обычных типов, объекты класса могут также адресоваться указателями 
и ссылками. Думайте о классах, как о новых типах данных, и используйте их 
соответствующим образом, так же, как и переменные других типов. 
    Природа объекта, а именно: является ли он глобальным, локальным, 
адресуемым указателем и т.д. — влияет на то, когда будут вызываться 
конструкторы и деструктор этого объекта класса. При создании объекта C++ 
автоматически вызывает конструктор этого объекта по умолчанию или другой 
конструктор, который вы укажете в объявлении объекта. Когда объект выходит из 
области видимости, C++ вызывает его деструктор. На рис. 13.5 на временном 
отрезке представлены все эти действия с отметкой типичных событий, 
происходящих в жизни объекта. 
    Следующие замечания помогут прояснить, когда вызываются конструкторы и 
деструкторы для объектов классов различных типов. 

    Глобальные объекты класса 

    Конструкторы глобальных объектов класса вызываются до начала выполнения 
функции main(). Это обеспечивает инициализацию всех глобальных объектов до 
формального начала выполнения программы. При использовании класса TTime 
(листинги 13.18 и 13.19) глобальное объявление 

    TTime today;	

    328            Часть III. Программирование на ANSI C++ 
