Введение в объектно-ориентированное программирование

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

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса.

Абстракция данных

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

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

– Сокрытие данных — неотделимая часть ООП, управляющая областями видимости. Является логическим продолжением инкапсуляции. Целью сокрытия является невозможность для пользователя узнать или испортить внутреннее состояние объекта.

– Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (прародителя, иногда его называют суперклассом) и добавляя, при необходимости, новые свойства и методы. Набор классов, связанных отношением наследования, называют иерархией. Наследование призвано отобразить такое свойство реального мира, как иерархичность.

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

С++

Класс состоит из полей (данных) и методов (функций). То есть класс в простейшем понимании – это структура данных (struct), дополненная функциями их обработки.

Пример.

class A

{

public:

double x,y,z;

double sum() {return x+y+z;}

} ;

Поля и методы, описанные в секции «public» доступны для доступа из вне класса.

A a;

a.x = 5.2; a.y = 7.4; a.z = 8;

double t = a.sum();

Существуют специальные методы: конструктор (вызывается при создании экземпляра класса) и деструктор (вызывается при уничтожении объекта). Имя конструктора совпадает с именем класса. Имя деструктора – имя класса, перед которым стоит символ «~» (тильда). Возвращаемый тип для конструктора и деструктора не указывается.

Пример.

class String

{

private:

char *text;

public:

String(int len) {text = new char[len];}

~String() {delete [] text;}

};

Поля и методы, описанные в секции «private» не доступны из вне класса.

Создание объекта класса происходит аналогично объявлению переменной:

String t(10); //требуется указывать размер строки, т.к. определен конструктор с параметром

int y = strlen(t.text); // вызовет ошибку, т.к. text – закрытое поле

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

Перегрузка операций – позволяет переопределять операции для конкретных классов.

Более подробно объектно-ориентированное программирование в данном курсе не рассматривается.

Пример реализации массива из п. 1.12 с использованием классов приведен в приложении.