как SmallTalk и Actor, C++ — гибридный язык программирования, который 
сочетает в себе качества обычного и объектно-ориентированного подходов. Это 
означает, что при изучении ООП вы можете пользоваться тем, что вам уже 
известно о C++. Вам нет надобности одновременно вникать во все детали ООП. 
    В этой главе, как и в главах 14 и 15, приводится основная информация о 
классах в C++ и поясняется, какое отношение имеют классы к трем основным 
преимуществам ООП. 

    •	Инкапсуляция 
    •	Наследование 
    •	Виртуальные функции 

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

    Скандал в раю 

    В традиционном программировании программистам часто приходится трудиться 
больше, чем это необходимо. Например, рассмотрим, как можно представить дату и 
время — это типичная задача, которую приходилось решать многим, если не 
большинству программистов. В ANSI С вы объявили бы структуру, подобную следующей: 

    struct TTime { 
      int year; 
      int month; 
      int day; 
      int hour; 
      int minute; 
   }; 

    Члены TTime сохраняют компоненты значений даты и времени. Лишнее Т в TTime 
означает тип (type) — это соглашение, которое помогает отличать имена типов 
данных от прочего. В соответствии с этой структурой вы можете объявить 
переменную типа TTime следующим образом: 

   TTime appointment; 

    Заметьте, что C++ позволяет опустить ключевое слово struct перед TTime, 
обязательное в ANSI С. В соответствии с данным объявлением вы можете присвоить 
значения членам переменной appointment с помощью следующих операторов: 

    appointment.year = 1996; 
    appointment.month = 7; 
    appointment.day = 14; 
    appointment.hour = 8; 
    appointment.minute = 30; 

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

    void Display(struct TTime *tp) 
    { 
    char buffer[32] ; 
    sprintf( buffer,   "Date: %02d/%02d/%04d Time: %02d:%02d\n",  tp->month,  
    tp->day,  tp->year,  tp->hour,  tp->minute ) ; 
    cout « buffer ; 
    } 

    Чтобы отобразить дату и время, можно передать в операторе вызова функции 
Display() адрес структуры appointment типа TTime: 

    Display ( & appointment ) ; 

    Пока "в раю" все прекрасно. Не принимая во внимание, конечно, типичной 
проблемы, которая может превратить в ничто весь написанный код. После создания 
структуры, подобной TTime, и написания тьмы-тьмущей функций, работающих с 
датами и временем, вы обнаруживаете превосходный способ запоминания даты и 
времени, который значительно повысит скорость выполнения вашей программы. 
Например, вы можете использовать длинное целое для хранения количества секунд 
от фиксированной даты. Это изменение также даст возможность пользоваться 
библиотечными функциями, работающими с датой и временем и распознающими такой 
способ их запоминания. Плохо только, что эта идея не посетила вас раньше! Для 
изменения внутреннего представления данных в конечной стадии написания 
программы вам придется сделать следующее. 
    
    306	Часть III. Программирование на ANSI C++ 