Основные понятия объектно-ориентированного программирования. Реализация концепций ООП в различных языках программирования.
Объектно-ориентированное программирование
Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы могут образовывать иерархию наследования.
Преимущества использования ООП
? уменьшение сложности программного обеспечения;
? повышение надежности программного обеспечения;
? обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;
? обеспечение возможности повторного использования отдельных компонентов программного обеспечения.
Классы и объекты
l Класс – определенный пользователем проблемно-ориентированный тип данных, описывающий внутреннюю структуру объектов, которые являются его экземплярами.
l Объект (экземпляр класса) находится в таком же отношении к своему классу, в каком переменная находится по отношению к своему типу.
Состав класса
В состав класса входят данные и функции. В совокупности они называются членами класса.
l Данные, входящие в класс, называются данными-членами или полями.
l Функции, принадлежащие классу, называют функциями-членами или методами.
Объединение в одной конструкции полей и методов называется инкапсуляцией
Описание класса в языке C++ (в простейшем случае)
class имя_класса {
спецификаторы_доступа
описания_полей
описания_методов
};
Описания полейпо формату совпадают с описаниями переменных .
Описания методовпредставляют собой заголовки функций.
Спецификаторы доступаслужат для разграничения полномочий между разработчиками и пользователями класса
Внутренние и внешние методы
Методы класса делятся на внутренние и внешние.
l Внутренние методы реализованы в рамках описания класса; их текст доступен для чтения пользователям класса.
l Внешние методы реализованы как отдельные функции. Для того, чтобы показать, что это – не обычная функция, а метод конкретного класса, к имени метода добавляется имя класса с помощью операции :: (расширение области видимости). Текст внешних методов может быть скрыт от пользователей класса.
Пример описания и реализации класса (точка на плоскости)
class Point2D {
double x, y; // поля класса
double Module () { // внутренний метод
return sqrt(x*x+y*y);
}
};
Спецификаторы доступа
? private: — члены класса, доступные только разработчикам класса (т.е. только при реализации методов этого класса)
? public: — члены класса, доступные как разработчикам, так и пользователям класса
? protected: — члены класса, доступные разработчикам класса и разработчикам классов-потомков
Спецификатор по умолчанию – private:
Рекомендации по использованию разграничений доступа
? Поля класса следует максимально защитить от пользователей класса, объявив их со спецификатором private:
? Для работы с объектами пользователь может пользоваться методами этих объектов, объявленными со спецификатором public:
? Для получения информации о характеристиках объекта (в том числе о защищённых полях) должны быть написаны т.н. get-методы
? Для изменения характеристик объекта (в том числе защищённых полей) должны быть написаны т.н. set-методы
Константные методы
Методы, не изменяющие значения полей объекта, для которого эти методы применяются, называются константными.
Для объявления константного метода необходимо записать слово const в конце заголовка такого метода (как в описании класса, так и в реализации)
Преимущества константных методов:
? дополнительный контроль компилятора за правильностью написания;
? в функциях, в которые объект передаётся по константной ссылке, для этого объекта можно вызывать только константные методы.
Конструкторы
Конструктор – специальный метод, который неявно вызывается при создании нового объекта.
Назначение конструктора – выполнение дополнительных действий по инициализации объекта (например, задание начальных значений полей создаваемого объекта).
Описание конструктора
? Конструктор может быть, как внутренним, так и внешним методом;
? Имя конструктора совпадает с именем класса;
? Конструктор не возвращает никакого значения (даже void);
? За счет механизма перегрузки может быть создано несколько конструкторов, различающихся набором параметров;
? Если ни одного конструктора не написано, реализуется т.н. конструктор по умолчанию без параметров. Этот конструктор не выполняет никаких дополнительных действий.
Список инициализаторов в конструкторе
В реализации конструктора может быть задан список инициализаторов, который записывается после заголовка конструктора через знак: Элементы списка разделяются запятыми.
Каждый элемент списка содержит имя поля и способ его инициализации в круглых скобках.
Для обычных полей использование списка инициализации допустимо, но не обязательно.
Список инициализации обязателен:
? если в качестве поля задаётся объект другого класса, для которого должен быть запущен конструктор;
? для вызова конструктора предка при использовании механизма наследования
Деструкторы
Деструктор – специальный метод, который неявно вызывается при корректном уничтожении объекта.
Назначение деструктора – выполнение дополнительных действий по освобождении ресурсов, захваченных при создании объекта или в процессе работы с ним.
Если деструктор не написан, вызывается т.н. деструктор по умолчанию, который не выполняет никаких дополнительных действий.
Описание деструктора
? Деструктор может быть как внутренним, так и внешним методом;
? Имя деструктора совпадает с именем класса, перед которым стоит знак ~;
? Деструктор не имеет параметров.
Конструктор копирования
Конструктор копирования – специальный конструктор, который получает в качестве параметра константную ссылку на объект этого же типа.