- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
Карасев Н.И.
Методология объектно-ориентированного программирования
Обзорные лекции по курсу
Лекция 6. Классы и объекты. Структура классов. Наследование классов
Феномен объектно-ориентированного программирования заключается в том, что создание и манипулирование объектами созданного класса сводится к простой последовательности вызовов его функций-членов. При этом не требуется или совсем мало требуется управляющих конструкций, так как большая часть логически необходимых управляющих конструкций перемещается в реализации функций- членов класса.
Функции-члены можно разбить на ряд категорий: функции для чтения и возврата значений закрытых данных-членов класса; функции для установки значений закрытых данных-членов; функции, реализующие функциональные возможности класса; функции для выполнения вспомогательных операций: задание начальных значений объектам класса, присваивания объектам класса, преобразования между классами и встроенными типами или между классами и другими классами, выделение памяти для объектов класса.
Нужно писать программы, которые легко понимать и поддерживать. Изменения в программах являются скорее правилом, чем исключением, а поэтому программист должен предвидеть объективную необходимость изменений созданного им кода. Именно классы способствуют минимальным затратам интеллектуального труда на неизбежную модификацию программ.
Содержание лекции:
1.Концепции и методология объектно-ориентированного программирования
2. Классы. Конструкторы и деструкторы
3. Простое и множественное наследование
4.Резюме
5. Упражнения для самопроверки
1.Концепции и методология объектно-ориентированного программирования
Для реализации основополагающих концепций Объектно-ориентированного программирования в языке C++ используются классы. Напомним, что понятием класс определяется группа однотипных объектов. При этом каждый представитель (или экземпляр) класса называется объектом. Каждый объект всегда имеет свое, уникальное состояние, определяемое текущими значениями его данных-членов (элементов-данных). Функциональное назначение класса определяется возможными действиями над объектами класса, которые задаются его функциями-членами (функциями-элементами или методами). В каждом классе распределяется память для хранения данных, и устанавливаются допустимые операции для каждого объекта данных данного типа. Создание объектов данного класса производится специальной функцией-членом, которая называется конструктором, а уничтожение — другой специальной функцией-членом, которая называется деструктором. Класс позволяет делать недоступными внутренние данные, представляя их как открытые (public), закрытые (private) и защищенные (protected). Класс устанавливает четко определенный интерфейс для взаимодействия объектов этого типа с остальным миром. Закрытые коды или данные доступны только внутри этого объекта. С другой стороны, открытые коды и данные, несмотря на то, что они заданы внутри объекта, доступны для всех частей программы. Открытая часть объекта как раз и используется для создания интерфейса объекта с остальным миром. Полученными объектами можно управлять при помощи сообщений (или запросов), которые представляют собой просто вызовы функций-членов. Мы будем пользоваться термином запрос, чтобы не путать это понятие с сообщениями операционной системы Windows.
Наследование — это процесс, посредством которого один объект может приобретать свойства другого. Это означает, что в ООП на основе уже существующих классов можно строить производные классы. При этом производный класс (называемый также классом-потомком) наследует элементы-данные и функции-члены от своих родительских классов (классов-предков), добавляя к ним свои, которые позволяют ему реализовать черты, характерные только для него. Защищенные данные-члены и функции-члены родительского класса доступны из производного класса. Кроме того, в производном классе наследуемые функции могут быть переопределены. Таким образом, можно построить целую иерархию классов, связанных между собой отношением родитель — потомок. Термин базовый класс используется как синоним родительскому классу в иерархии классов. Если объект наследует свои атрибуты (данные-члены и функции-члены) от одного родительского класса, говорят об одиночном наследовании. Если объект наследует атрибуты от нескольких родителей, говорят о множественном наследовании. Наследование позволяет значительно сократить определение класса-потомка благодаря тому, что классы-потомки являются расширениями родительских классов.
Полиморфизм (от греческого "polymorphos" — множественность форм) — это свойство кода вести себя по-разному, в зависимости от ситуации, возникающей в момент выполнения. Полиморфизм — это не столько характеристика объектов, сколько характеристика функций-членов класса и проявляется, в частности, в возможности использования одного имени функции-члена для функций, имеющих различные типы аргументов, если выполняемые функцией действия определяются типом переданных ей аргументов. Это называется перегрузкой функций. Полиморфизм может применяться и к операциям, то есть выполняемые операцией действия также могут зависеть от типа данных (операндов). Такой тип полиморфизма называется перегрузкой операций.
В более общем смысле полиморфизм — это способность объектов различных классов отвечать на запрос функции сообразно типу своего класса. Другими словами, полиморфизм — это способность указателей (или ссылок) на базовый класс принимать различные формы при использовании их для вызовов виртуальных функций. Такая возможность в C++ является результатом позднего связывания. При позднем связывании адреса вызываемых функций-членов определяются динамически во время выполнения программы, а не статически во время компиляции, как в традиционных языках, в которых применяется раннее связывание. Позднее связывание выполняется только для виртуальных функций.
Теперь, когда мы рассмотрели основные концепции ООП, мы можем остановиться на методологии ООП. В этой методологии решаемая задача представляется не в виде алгоритмической модели, а в виде совокупности объектов различных классов, которые обмениваются запросами. Объект, получивший запрос, отвечает на него посредством вызова соответствующей функции-члена. Нахождение общности между типами объектов задачи — далеко не простой процесс. Он осуществляется на стадии объектно-ориентированного проектирования. На этой стадии вначале рассматривается вопрос о применимости ООП к решаемой задаче. При этом для принятия решения о применимости ООП решающую роль играет та степень общности между классами, которую можно использовать, применяя механизмы наследования и виртуальные функции.
В некоторых задачах, таких как разработка графического интерфейса приложения, разработка приложений баз данных и компьютерная графика, простор для ООП поистине безграничен. Кроме того, методы ООП позволяют скрыть детали низкоуровневых сетевых протоколов. Поэтому они широко применяются при программировании приложений, работающих в сетях (как локальных, так и глобальных, например, в Internet). В случае принятия решения о применимости ООП на следующем этапе проектирования разрабатываются классы как строительные блоки для других типов и изучаются возможности выделения в классах тех свойств, которые могут быть переданы базовому классу. Затем проектируются те запросы, которыми будут обмениваться объекты, и осуществляется реализация разработанных объектов и запросов.
Пусть Вас не смущает то, что не все из этих понятий сразу станут ясны. Возвратитесь к этим понятиям после изучения последующих тем.