Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть II. Объектно-ориентированное программирование

177

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

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

Важно до начала проектирования правильно определить, требуется ли вообще применять объектно-ориентированный подход. Если в иерархии классов нет необходимости, то, как правило, достаточно ограничиться модульной технологией, при этом можно успешно использовать классы как стандартной библиотеки, так и собственной разработки. Естественно, для применения стандартных классов требуется сначала изучить необходимый синтаксис и механизмы, а затем — конкретные свойства этих классов1.

1 В программах, приведенных в этой книге, уже незаметным образом применялись классы стандартной библиотеки cin и cout. Использование других классов может на первый взгляд показаться не столь простым, но эффект оправдает затраченные на изучение усилия.

Глава 4

Классы

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

Описание класса

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

Данные класса называются полями (но аналогии с полями структуры), а функции класса — методами1. Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:

class <имя>{ [ private: ]

<описание скрытых элементов> public:

<описание доступных элементов> }; // Описание заканчивается точкой с запятой

Спецификаторы доступа private и publ ic управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса опи-

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

Глава 4. Классы

179

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

Поля класса:

  • могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

  • могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться;

  • могут быть описаны с модификатором static (об этом рассказывается в разделе «Статические поля», с. 186), но не как auto, extern и register.

Инициализация полей при описании не допускается.

Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри блока, например, функции или другого класса).

Ниже перечислены некоторые особенности локального класса:

  • внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан; запрещается использовать автоматические переменные из этой области;

  • локальный класс не может иметь статических элементов;

  • методы этого класса могут быть описаны только внутри класса;

  • если один класс вложен в другой класс, они не имеют каких-либо особых прав доступа к элементам друг друга и могут обращаться к ним только по общим правилам.

В качестве примера создадим класс, моделирующий персонаж компьютерной игры. Для этого требуется задать его свойства (например, количество щупалец, силу или наличие гранатомета) и поведение. Естественно, пример будет схематичен, поскольку приводится лишь для демонстрации синтаксиса.

class monstr{

int health, ammo; public:

monstr(int he = 100. int am = 10){ health = he; ammo = am;}

void drawdnt x. int y, int scale, int position);

int get_health(){return health;}

int get_ammo(){return ammo;} }: В этом классе два скрытых поля — health и ammo, получить значения которых извне можно с помощью методов get_health() и get_ammo(). Доступ к полям с помощью методов в данном случае кажется искусственным усложнением, но надо учитывать, что полями реальных классов могут быть сложные динамические структуры, и получение значений их элементов не так тривиально. Кроме того, очень важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса.