- •Оглавление
- •1 Основные методы программирования. Лекция №2 5
- •2 Методы объектно-ориентированного программирования. Лекция №6. 15
- •2.4 Вопросы по теме 54
- •3 Объектно-ориентированное проектирование. Лекция №12 55
- •3.4 Вопросы по теме 74
- •Введение. Лекция №1.
- •1Основные методы программирования. Лекция №2
- •1.1Процедурное программирование Методы процедурного программирования
- •Этапы разработки программ. Лекция 3.
- •1.2Объектно-ориентированное программирование Лекция №4
- •Этапы разработки оо программ. Лекция №5
- •Конструкторы и деструкторы. Лекция №7.
- •Друзья класса
- •2.2Наследование. Лекция №8
- •Производный класс
- •Простое наследование
- •Множественное наследование. Лекция №9
- •Виртуальные базовые классы
- •2.3Полиморфизм. Лекция №10
- •Перегрузка операций
- •Преобразования типов, определяемые классом
- •Перегрузка функций.
- •Чистый полиморфизм
- •Виртуальные элементы-функции
- •Абстрактные классы. Лекция №11.
- •Параметрический полиморфизм
- •Шаблоны функций
- •Шаблоны классов
- •2.4Вопросы по теме
- •3Объектно-ориентированное проектирование. Лекция №12
- •3.1Концепция объектно-ориентированного проектирования
- •3.2Проектирование структурной схемы программы Составление начальной иерархии и структуры классов
- •Реорганизация иерархии и структуры классов
- •Организационная структура программы
- •3.3Проектирование файлов интерфейсов классов. Лекция № 13. Файл интерфейса базового класса
- •Файлы интерфейсов производных классов
- •Файл управления
- •3.4Вопросы по теме
- •Общие моменты разработки программы на основе объектно-ориентированного подхода
- •Приложение а
Этапы разработки оо программ. Лекция №5
Метод объектно-ориентированного программирования основан на модели построения программы, как иерархии классов. Этапы разработки программ задач принципиально отличаются от процедурного программирования, так как проектирование программы ведется в терминах (понятиях) прикладной области и отражает ее иерархию.
"Ключ к искусному проектированию можно подобрать, если непосредственно моделировать некоторые аспекты "окружающей действительности", то есть "поймать" понятия из данной прикладной области в виде классов, представить зависимости между классами формальным образом, например, в виде наследования, и проделывать это повторно на разных уровнях абстракции"[2].
Разработка программ экономических задач, исходя из изложенных ранее их особенностей, состоит из следующих этапов:
- проектирование структуры программы, включающее проектирование структурной схемы программы, представляющей собой иерархию взаимосвязанных классов, и интерфейсов классов;
- программирование классов.
Этап проектирования структурной схемы программы представляет собой итерационный процесс и включает следующие подэтапы:
- составление начальной иерархии классов, являющимися понятиями прикладной области, входящие в условие задачи, и определение для каждого класса совокупности элементов-данных и элементов-функций для их обработки;
- реорганизация иерархии классов, т.е. либо выделение общих элементов нескольких классов в новый класс, либо разделение класса на несколько новых.
Проектирование интерфейсов классов основано на выборе средств инкапсуляции, наследования и полиморфизма.
В проектировании должен участвовать менеджер соответствующей службы предприятия, т.е. пользователь разрабатываемой системы управления. Можно рекомендовать в качестве классов документы, циркулирующие в разрабатываемой системе. Взаимозависимость документов определяет взаимозависимость классов. Каждый класс-документ будет содержать совокупность собственных и наследуемых реквизитов и функций. Поскольку управление задачей осуществляется с помощью меню, файл управления будет содержать главную функцию main, функции меню и объявления объектов классов, с помощью которых будут вызываться соответствующие элементы-функции классов.
Этап программирования заключается в программировании элементов-функций целых взаимосвязанных классов, начиная с базовых классов, и не подчиняется правилам программирования "сверху - вниз".
1.3Вопросы по теме
Дать определение инкапсуляции.
Дать определение наследования.
Дать определение полиморфизма.
Дать сравнительную характеристику процедурного и объектно-ориентированного программирования.
Перечислить основные этапы разработки программ.
2Методы объектно-ориентированного программирования. Лекция №6.
2.1Инкапсуляция
Инкапсуляция (encapsulation) - это объединение данных и функций для работы с этими данными в классы. Метод инкапсуляции реализуется механизмом классов.
Класс
Класс - это совокупность элементов-данных различных типов и элементов-функций для их обработки с атрибутами доступа к ним.
Синтаксис определения класса:
class cl //cl - имя класса (идентификатор типа)
{
atr: //atr - атрибут доступа (private,public,protected)
tip1 per1; //элементы-данные
[...]
tf1 f1(tp1 p1[,...]);//прототипы элементов-функций
[...] //...новые атрибуты и новые элементы
[...] //конструкторы и деструкторы
[...] //друзья класса
};
Определение класса не резервирует память под элементы класса, это делает объявление объекта класса.
Синтаксис объявления объекта класса: cl obj;
Атрибуты (спецификаторы доступа) осуществляют управление доступом к элементам класса:
private - закрытые элементы, доступны только для элементов-функций данного класса и друзей класса;
public - открытые элементы, доступны для любых функций;
protected - защищенные элементы, доступны для элементов-функций данного класса и производных классов.
По умолчанию действует private.
Структуры и объединения рассматриваются как типы классов с атрибутом доступа public.
В многофайловых проектах целесообразно размещать определение класса с прототипами функций в файле заголовков, а определения функций - в файле кодов, причем перед именем функции ставится имя класса с операцией разрешения видимости (::).
Пример:
//файл заголовков //файл кодов
class akt void akt::vvod()
{ {
void vvod(); ...
}; }
Элементами класса служат элементы-данные и элементы-функции.
Элементы-данные - это совокупность взаимосвязанных данных различных типов, объявленная в определении класса.
Элементы-данные характеризуются следующими свойствами:
могут быть базового типа, массивами, типами, определяемыми пользователем, объектами ранее объявленного класса;
не могут быть объектами данного класса, но могут быть указателями или ссылками на объекты данного класса;
не могут быть явно инициализированы в теле класса (можно с помощью конструктора, см. ниже);
не могут иметь спецификаторы auto, extern, register;
могут иметь статический класс памяти (static); такие элементы-данные совместно используются всеми объектами данного класса (существует только по одному экземпляру таких данных); они должны быть объявлены в определении класса в файле заголовков и определены в файле кодов, где могут быть инициализированы (нельзя инициализировать в теле класса и элементах-функциях);
могут быть именными константами (const); должны быть инициализированы (например, с помощью конструктора).
Пример:
//файл заголовков //файл кодов
class listok long listok::nadbavka;
{... ...
static long nadbavka;
const char* otdel;
};
Элементы-функции - это функции, объявленные в определении класса и обрабатывающие элементы-данные класса.
Элементы-функции характеризуются следующими свойствами:
могут быть определены внутри или вне определения класса;
имеют доступ ко всем элементам данного класса независимо от их расположения в теле класса;
каждая не статическая элемент-функция при ее вызове объектом получает неявно объявленную переменную this (зарезервированное слово), которая является указателем на объект класса;
могут иметь статический класс памяти (static); такие функции могут обращаться только к статическим элементам класса и не могут быть объявлены const и virtual; они не связаны с объектами класса, т.е. при вызове не получают указатель this;
могут быть константными (const ставится за списком параметров функции); такие функции не могут изменять значения элементов-данных класса, что ведет к более устойчивому тексту программы.
Существуют еще специальные элементы-функции класса (конструкторы и деструкторы), служащие для создания, копирования, преобразования и уничтожения объектов класса (см. ниже).
Элементы класса имеют область действия этого класса. Доступ к элементам класса может выполняться следующими способами:
прямой доступ (по имени элемента) - из элементов-функций этого класса или из производных классов;
через объект класса - из внешних функций или из других классов, например, во внешней функции имеем obj.sozdanie(); , где obj - объект класса ved и sozdanie() - элемент-функция класса ved;
через указатель на объект класса, например, pobj->vvod(), где pobj - указатель на объект obj класса akt (akt* pobj=&obj);
через имя класса с операцией разрешения видимости (::), например, akt::chtenie_zap() или cena::chtenie_zap() при доступе из производного класса ved .
Схема доступа к элементам класса cl1 (без наследования):
class cl1 //внешняя функция или
{ //функция другого класса
private: cl1 obj; //или cl1* p=&obj;
int a; //доступ только к c и z()
void x(); //например,
protected: obj.z(); //или p->z();
int b; obj.c=10;//или p->c=10;
void y();
public:
int c;
void z();
}; //любая функция класса cl1 имеет доступ к a, x(), b, y(), c, z()
Остановимся на понятии указателя this. Каждая не статическая элемент-функция класса имеет доступ к объекту, для которого она вызвана, с помощью переменной this (неявного указателя). При вызове элемента-функции указатель this инициализируется адресом конкретного объекта класса. Например, при вызове obj.z() в стек загружается значение &obj, а в теле функции оператор a=10 интерпретируется как (&obj)->a=10. Обычно указатель this не используется явно. Но иногда он может быть полезен, например, при организации списков для возврата указателя ( return (this) ) или ссылки ( return* this ) на какой-то объект класса. Статическая элемент-функция класса не имеет указателя this, т.е. не связывается с конкретным объектом класса. Поэтому, для доступа к ней необходимо имя класса с операцией разрешения видимости.