Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_на_С++_Ч2_ООП.doc
Скачиваний:
54
Добавлен:
22.02.2015
Размер:
633.34 Кб
Скачать

Введение

В С/С++ вводится понятие класса – тип данных, объединяющий структуры данных и обрабатывающие их функции. Конкретные величины типа данных «класс» называются экземплярами класса или объектами.

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

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

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

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

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

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

Данные класса называются полями, а функции класса – методами (в литературе по языку С/С++ используются чаще термины «данные-члены» и «функции-члены», а также «компонентные данные» и «компонентные функции»). Поля и методы называются элементами класса. Описание класса имеет следующий вид:

class имя {

[private:]

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

public:

<описание доступных элементов>

};

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

Поля класса:

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

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

– могут быть описаны с модификатором static, но не как auto, extern и register.

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

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

Пример. Класс, моделирующий персонаж компьютерной игры:

class monstr {

int health, ammo;

public:

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

void draw (int x, int y, int scale, int position);

int get_health ( ) {return health;}

int get_ammo ( ) {return ammo;}

};

В этом классе два скрытых поля – health и ammo, получить значения которых можно с помощью методов int get_health ( ) и get_ammo ( ). Кроме этого, в классе содержится три определения методов и одно объявление (метод draw). Если тело метода определено внутри класса, метод является встроенным (inline). Как правило, встроенными делаются короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):

void monstr :: draw (int x, int y, int scale, int position) {

/* тело метода*/

}

Метод можно определить как встроенный и вне класса с помощью директивы inline:

inline int monstr :: get_ammo( ) {

return ammo;

}

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

Задание

Спроектируйте класс – «калькулятор», предназначенный для выполнения арифметических операций с двумя операндами.