    Заметьте, что C++ позволяет опустить ключевое слово struct перед TTime, 
обязательное в ANSI С. 


   Конечно, члены не могут использовать спецификаторы классов памяти auto, extern или register. 


    В новом классе TTime — три дополнения. Во-первых, спецификатор доступа 
private (строка 5) делает закрытыми в классе данные-члены в строках 6-10. 
Благодаря этому изменению только функции-члены класса могут непосредственно 
ссылаться на эти данные-члены. Запомните следующее правило: закрытые (private) 
члены класса доступны только членам этого класса и никому более, закрытые 
члены невидимы вне класса. 


   Хотя это не показано в примере, функции-члены также могут 
быть объявлены в закрытой части, но обычно они открыты. Вы также узнаете о 
третьем спецификаторе доступа, protected, в главе 14. 


  Непосредственный результат инкапсуляции данных и функций в классе — при изменении 
представления данных требуется переписать лишь функции-члены класса.


    Когда подобный оператор вызывает функцию-член, C++ передает функции адрес 
объекта, в данном случае адрес appointment. Внутри функции-члена адрес объекта 
доступен с помощью специального ключевого слова this. Все функции-члены 
получают указатель this, ссылающийся на объект класса, для которого 
функция-член была вызвана. В листинге 13.5, в строке 12, функции-члену 
ChangeTime() передается указатель this, в котором хранится адрес appointment. 
Иначе говоря, подобным образом функции-члены ссылаются на объекты класса, для 
которых они были вызваны.

    12:	    appointment.ChangeTime(30); 

    Вы можете использовать this в качестве указателя на объект типа класса. 
Например, строку 21 в листинге 13.4 можно было написать следующим образом: 

    m = this->month; 

    18:	// Возвращает текущие данные-члены дату и время 
    19:	void TTime::GetTime(int &m, int &d,. int &y, int &hr, int &min) 
    20:	{ 
    21:	  m = month; // Возвращение данных-членов тому, кто вызвал функцию 
    22:	  d = day; 

   Конечно, в большинстве случаев нет нужды в непосредственном использовании this. 
Оператор m = month; по умолчанию ссылается на month — член объекта класса, на 
который ссылается this. 


Инкапсуляция данных и функций в классе локализует изменения в коде путем запрещения 
прямого доступа к данным, минимизируя таким образом потенциальное количество 
модификаций, требующихся после изменения внутреннего представления данных. 


    today. Display();	

    Несмотря на внешний вид, программа с компилируется так, как если бы вы написали 

    cout « ctime(&today.dt); 

    Конечно, вы не можете в действительности написать такой оператор, 
поскольку dt — закрытый член класса TTime и, следовательно, недоступен вне класса. 

Вы также можете объявить встраиваемую функцию-член с помощью ключевого слова 
inline в модуле реализации класса. 

    Конечно, поставив inline перед именем функции, можно и не добиться 
желаемого результата, поскольку реализация встраиваемых функций-членов должна 
быть доступна компилятору до того, как эта функция будет вызвана. В 
большинстве случаев встраиваемые функции-члены лучше всего распознаются, когда 
они объявлены непосредственно в классе. 


    Значения функций-членов по умолчанию не приводятся в заголовке функции в 
строке 21. Значения по умолчанию могут присутствовать только в объявлении функции-члена. 

  Конструкторы и деструкторы похожи на обычные функции-члены, но они реже 
вызываются непосредственно в операторах программы. C++ автоматически вызывает 
конструкторы и деструкторы для инициализации и очистки объектов класса. 

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

Если конструктор объявляется без параметров, он вызывается по умолчанию. 

TIME6.H и TIME6.CPP (листинги 13.18 и 13.19), а также показывает, как 
используется деструктор для очистки объекта класса при его выходе из области 
видимости. Скомпилируйте листинг 13.21, введя в DOS команду bcc destruc timeG 

памяти. Объект типа TTime не должен выходить из области видимости без 
освобождения выделенной этому объекту памяти, иначе это приведет к ошибкам, 
связанным с нехваткой памяти. Кроме того, если дата и время объекта класса 

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

    Если объект класса выходит из области видимости, C++ автоматически 
вызывает деструктор объекта класса, если таковой имеется. Это дает объекту 

различными способами. Конечно, класс может иметь не более одного деструктора, 
который вызывается автоматически при уничтожении объекта Или при выходе его из 
области видимости. Если необходимо по-разному уничтожать объекты, деструктор 
может вызывать функции-члены, использовать оператор switch и другие средства 
для адекватных действий в различных ситуациях. 

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

    Если вы вызываете exit() для того, чтобы завершить программу, деструкторы 
глобальных объектов классов вызываются как обычно, а деструкторы любых 
существующих автоматических переменных, локальных в функции (включая и те, 
которые локальны в mainO), не вызываются.

    C++ вызывает деструкторы динамических объектов класса при их удалении. Оператор 

    ЗАМЕЧАНИЕ 

    Не путайте жизнь указателя с жизнью объекта, на который он ссылается. 
Глобальный указатель существует до тех пор, пока программа не завершится, но 
он может ссылаться на множество объектов класса, создаваемых с помощью new и 
удаляемых с помощью delete. Аналогично, автоматические указатели, объявленные 
локальными в функции, создаются при выполнении функции и уничтожаются при ее 
завершении. Но объекты, на которые ссылаются указатели, имеют глобальную 
область дейтвия и должны удаляться явным образом. В функции f(), если вы 
вызовете new для создания объекта в куче, этот объект останется в памяти даже 
после завершения функции. Вы должны явным образом удалять любой подобный 
объект, если вы не хотите, чтобы он оставался в памяти после возврата из функции. 

    Ссылка rToday — алиас для today, и может использоваться вместо today. 
Например, каждый из следующих двух операторов выведет дату и время: 

    rToday.Display() ; 
    today. Display() ;

    Поскольку ссылки ссылаются на реально существующие объекты, при входе в 
область действия ссылки конструктор класса не вызывается и, соответственно, не 
вызывается деструктор при выходе из области действия ссылки. Эти действия 
выполняются только при создании и удалении самого объекта. 
    Обычно ссылки объявляются в качестве параметров функции   На практике они 
редко используются так, как описано в этом разделе. 


