5. КЛАССЫ "Эти типы не абстрактные, они столь же реальны, как int и float" - Даг Макилрой В этой главе описываются возможности определения новых типов, для которых доступ к данным ограничен заданным множеством функций, осуществляющих его. Объясняется, как можно использовать члены структуры данных, как ее защищать, инициализировать и, наконец, уничтожать. В примерах приведены простые классы для управления таблицей имен, работы со стеком, множеством и реализации дискриминирующего (т.е. надежного) объединения. Следующие три главы завершают описание возможностей С++ для построения новых типов, и в них содержится больше интересных примеров. 5.1 Введение и краткий обзор Понятие класса, которому посвящена эта и три следующих главы, служит в С++ для того, чтобы дать
программисту инструмент построения новых типов. Ими пользоваться не менее удобно, чем
встроенными. В идеале использование определенного пользователем типа не должно отличаться от
использования встроенных типов. Различия возможны только в способе построения.
Тип есть вполне конкретное представление некоторого понятия. Например, в С++ тип float с операциями
+, -, * и т.д. является хотя и ограниченным, но конкретным представлением математического понятия
вещественного числа. Новый тип создается для того, чтобы стать специальным и конкретным
представлением понятия, которое не находит прямого и естественного отражения среди встроенных
типов. Например, в программе из области телефонной связи можно ввести тип trunk_module (линия-
связи), в видеоигре - тип explosion (взрыв), а в программе, обрабатывающей текст, - тип
list_of_paragraphs (список-параграфов). Обычно проще понимать и изменять программу, в которой типы
хорошо представляют используемые в задаче понятия. Удачно подобранное множество
пользовательских типов делает программу более ясной. Оно позволяет транслятору обнаруживать
недопустимое использование объектов, которое в противном случае останется невыявленным до
отладки программы.
Главное в определении нового типа - это отделить несущественные детали реализации (например,
расположение данных в объекте нового типа) от тех его характеристик, которые существенны для
правильного его использования (например, полный список функций, имеющих доступ к данным). Такое
разделение обеспечивается тем, что вся работа со структурой данных и внутрение, служебные
операции над нею доступны только через специальный интерфейс (через "одно горло").