- •Тема 1.Понятие технологии программирования (2 часа). 3
- •Тема 2. Основные концепции ооп (2 часа). 7
- •Тема 3. Конструкторы и деструкторы (2 часа). 12
- •Тема 5. Дружественные функции (friend functions) (2 часа) 32
- •Тема 6. Обработка исключительных ситуаций (2 часа) 44
- •Тема 8. Производные классы (2 часа) 76
- •Тема 9. Виртуальные функции (2 часа) 83
- •Тема 10. Множественное наследование. Производные классы векторов (2 часа) 90
- •Тема 12. Шаблоны функций и классов. 128
- •Тема 14. Применение оо-подхода в базах данных 148
- •Тема 1.Понятие технологии программирования (2 часа).
- •1.1. Предмет изучения курса ооп
- •1.2. Исторический экскурс
- •1.3. Основные технологии программирования
- •1.4. Заключение
- •Тема 2. Основные концепции ооп (2 часа).
- •2.1. Объекты и классы
- •2.1.1.Понятие класса объектов
- •2.1.2. Основные характеристики состояния класса
- •2.1.3. Понятие инкапсуляции свойств объекта
- •2.1.4. Структура глобальной памяти класса и глобальные методы класса
- •2.1.5. Интерфейс класса
- •2.1.6. Функции-члены класса
- •2.2. Понятие наследования (Inheritance)
- •2.3. Понятиеполиморфизма
- •Тема 3. Конструкторы и деструкторы (2 часа).
- •3.1. Для чего нужны конструкторы
- •3.2. Использование конструкторов «по умолчанию»
- •3.3. Использование деструкторов
- •3.4. Демонстрация последовательности работы конструкторов и деструкторов
- •3.5. Конструктор копирования
- •3.6. Определение операции присваивания
- •3.6.1. Пример использования конструктора копирования.
- •3.7.1. Краткий обзор библиотеки stl
- •3.7.2. Вектора
- •3.8. Inline-подстановка
- •4.1. Перегрузка операторов
- •4.1.1. Пример на перегрузку операторов
- •4.1.2. Общие принципы перегрузки операторов
- •4.1.3. Бинарные и Унарные Операции
- •4.2. Пример с перегрузкой операторов
- •Тема 5. Дружественные функции (friend functions) (2 часа)
- •5.1. Примеры использования дружественных функций
- •5.2. Особенности перегрузки префиксной и постфиксной форм унарных операций
- •5.3. Статические члены данных
- •5.4. Перегрузка операторов new, new[], delete, delete[]
- •Void* operator new(size_t размер){ код оператора
- •Void operator delete(void* p){ код оператора }
- •Void* operator new[](size_t размер){ код оператора return указатель_на_память; }
- •Void operator delete[](void* p){ код оператора }
- •Тема 6.Обработка исключительных ситуаций(2 часа)
- •6.1. Применение try, catch, throw
- •6.2. Синтаксис и семантика генерации и обработки исключений
- •6.3. Обработка исключений
- •6.4. Обработка исключений при динамическом выделении памяти
- •6.5. Функции, глобальные переменные и классы поддержки механизма исключений
- •6.6. Конструкторы и деструкторы в исключениях
- •7.1 Строковые типы
- •7.1.1. Преобразования, определяемые классом
- •7.1.2. Встроенный строковый тип
- •7.1.3 Класс string
- •7.2. Пример строкового класса с перегруженными операторами и дружественными функциями
- •Тема8.Производные классы (2 часа)
- •8.1. Определение производного класса
- •8.2. Правила использования атрбутов доступа
- •8.3. Конструкторы и деструкторы производных классов
- •Тема 9. Виртуальные функции (2часа)
- •9.1. Определение виртуальных методов
- •9.2. Абстрактные классы
- •9.3. Таблицы виртуальных методов (функций)
- •9.4. Выводы
- •Тема 10. Множественное наследование. Производные классы векторов (2 часа)
- •10.1. Множественное наследование
- •10.2. Отношения между классами
- •10.2.3. Ассоциация
- •10.2.4. Агрегирование
- •10.2.5. Наследование
- •10.3. Библиотека графических объектов (пример)
- •10.3.1. Динамический полиморфизм и наследование интерфейсов
- •10.3.2.Абстрактные классы
- •10.3.3. Множественное наследование в библиотеке графичкских фигур.
- •10.3.4. Иерархия классов библиотеки графичкских фигур
- •10.3.5. Таблица наследования
- •10.3.6. Диаграмма модулей
- •10.3.7.Директивы препроцессора
- •10.4. Производные классы векторов
- •10.5. Операции над векторами
- •11.1. Потоковый ввод-вывод
- •11.1.1. Классы потоков
- •11.1.2. Стандартные потоки
- •11.2.Опрос и установка состояния потока
- •11.3.Перегрузка операций извлечения и вставки в поток
- •11.4.Переадресация ввода-вывода
- •11.5. Операции помещения в поток и извлечения из потока
- •11.6.Форматирование потока
- •11.7.Файловый ввод-вывод с использованием потоков
- •11.8.Бесформатный ввод-вывод
- •11.9.Часто применяемые функции библиотеки ввода / вывода
- •11.10.Файлы с произвольным доступом
- •11.11. Буферизация
- •11.12. Заключение
- •Тема 12. Шаблоны функций и классов.
- •12.1 Шаблоны функций
- •12.2. Шаблоны классов
- •12.3. Размещение определений шаблонов в многомодульных программах
- •12.4. Полиморфные вектора
- •13.1 Область видимости
- •13.1.1. Локальная область видимости
- •13.2. Глобальные объекты и функции
- •13.2.1. Объявления и определения
- •13.2.2. Несколько слов о заголовочных файлах
- •13.3. Локальные объекты
- •13.3.1. Автоматические объекты
- •13.3.2. Регистровые автоматические объекты
- •13.3.3. Статические локальные объекты
- •13.4. Динамически размещаемые объекты
- •13.4.1. Динамическое создание и уничтожение единичных объектов
- •13.5. Определения пространства имен а
- •Тема 14. Применение оо-подхода в базах данных
- •14.1. Реляционные базы данных
- •14.2 Объектно-ориентированные базы данных (ообд)
- •14.3. Гибридные базы данных
- •Рекомендуемая литература
2.1.1.Понятие класса объектов
Класс объектовв ООП рассматривается как абстрактный тип данных. Это означает, что в качестве некоторого единого целого в программе выступает определенная совокупность данных и набор операций (процедур), которые могут быть выполнены для этих данных.
Классявляется ключевым понятием C++. По определению Б.Страуструпа "Класс - это тип, определяемый пользователем". Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операцій (обо всем этом мы поговорим позже).
2.1.2. Основные характеристики состояния класса
Совокупность данных, которые характеризуют текущее состояние объекта определенного класса и его взаимосвязи с другими объектами, называют локальной (приватной) памятью объекта, а определенные для объектов данного класса операции- методами объектов класса.Совокупность всех методов, специфицированных для некоторого класса, называется интерфейсом класса.
2.1.3. Понятие инкапсуляции свойств объекта
Структура локальной памяти объектов и реализация методов скрыты от внешнего наблюдателя, т.е. любого другого объекта. Это фундаментальное свойство классов объектов в ООП получило название "скрытия данных" (data hiding) или, что более точно, -инкапсуляции свойств. В соответствии с догмами ООП не существует другого метода получить информацию о состоянии объекта или изменить состояние его приватной памяти, кроме как воспользоваться одном из специфированных в описании соответствующего класса методе. Единственно, что доступно знанию о методе - это способ и правила его вызова.
При реализации инкапсуляции свойств различные языки программирования позволяют управлять уровнем доступа к приватной памяти. Так, например, С++ допускает три уровня защиты данных и функций-членов класса: общедоступные, закрытые и защищенные (public, private, protected).. Другой особенностью С++ в этом аспекте является то, что в нем инкапсуляция свойств обеспечивается не на уровне объекта, а на уровне класса объектов. Это означает, в частности, что объект может получить доступ к приватной памяти другого объекта этого же класса или вызвать защищенный метод для такого объекта.
2.1.4. Структура глобальной памяти класса и глобальные методы класса
Кроме приватной памяти каждого объекта класса и методов объектов класса для него может быть определена также структура глобальной памяти класса и глобальные методы класса. Глобальная память- это совокупность данных, которая отображает состояние класса в целом (например, количество созданных объектов данного класса). Глобальные методы класса -это процедуры, общие для всех объектов - например, процедуры порождения и уничтожения экземпляров или манипулирования глобальными данными класса.
В С++ такие данные и методы носят название статических членов класса.
2.1.5. Интерфейс класса
Определение пользовательского типа (в C++ называется class), определяет данные, необходимые для представления объекта этого типа, и множество операций, для работы с этими объъектами. Определение имеет две части: закрытую (private) часть, которой может пользоваться только его разработчик, и открытую (public) часть, которая представляет интерфейс типа с пользователем. Формально самое простое описание класса выглядит так:
ключевое_слово имя_класса
{
список_членов
};
(то есть объединения и структуры в С++ являются элементарной формой класса). Поле имя_класса- уникальный идентификатор класса. Полесписок_членоввключает описание типов данных и имен данных, а также функций работы с ними. Переменные, перечисленные в классе, имеют тип(private)- область действия в пределах класса (по умолчанию - private) и доступ к ним имеют только функции-члены класса. Функции имеют типpublic, то есть видимы снаружи класса, и к ним может осуществляться доступ извне. Список членов - это важнейший элемент описания класса. Он определяет особенности объектов класса, их внутреннюю структуру, поведение и способы взаимодействия с другими объектами.
ПРИМЕР описания класса:
#include <iostream.h> // библиотека потоков ввода-вывода
#include <dos.h>
#include <stdlib.h>
// Описание класса
class my_date // определим класс дата
{
int day,mon,year;// по умолчанию private!
public:
my_date(char *str); //ініціалізація рядком
my_date(char *d, char *m, char *y); //инициализация символами
void print_dat(void);
};
// Описание методов класса
void my_date::print_dat(void) //вивід дать на печать
{
cout<<day<<'.'<<mon<<'.'<<year<<'\n';
}
my_date::my_date(char *str)
{
year = atoi(str+4); *(str+4)='\0'; //конвертация сроки в число
mon = atoi(str+2); *(str+2)='\0';
day = atoi(str );}
my_date::my_date(char *d, char *m, char *y)
{
year = atoi(y); //конвертация символа в число
mon = atoi(m);
day = atoi(d);
}
// Основная (прикладная) программа
void main (void)
{
// Объявляется класс прикладной программы типа my_date
my_date one_date = my_date("14021995");
// Вывод значения дать с использованием метода print_dat
one_date.print_dat();
}