- •Тема 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. Гибридные базы данных
- •Рекомендуемая литература
6.5. Функции, глобальные переменные и классы поддержки механизма исключений
Функция обработки неопознанного исключения. Функция voidterminate()вызывается в случае, когда отсутствует процедура для обработки некоторого сформированного исключения. По умолчаниюterminate()вызывает библиотечную функциюabort(), что влечет выдачу сообщения "Abnormal program termination" и завершение программы. Если такая последовательность действий программиста не устраивает, он может написать собственную функцию (terminate_function) и зарегистрировать ее с помощью функцииset_terminate(). В этом случаеterminate()будет вызывать эту новую функцию вместо функцииabort().
Функция set_terminate()позволяет установить функцию, определяющую реакцию программы на исключение, для обработки которого нет специальной процедуры. Эти действия определяются в функции, поименованной ниже какterminate_func(). Указанная функция специфицируется как функция типаterminate_function. Такой тип в свою очередь определен в файлеexcept.hкак указатель на функцию без параметров, не возвращающую значения:
typedef void (*terminate_function)();
terminate_function set_terminate(terminate_function terminate_func);
Функция set_terminate()возвращает указатель на функцию, которая была установлена с помощьюset_terminate()ранее.
Следующая программа демонстрирует общую схему применения собственной функции для обработки неопознанного исключения:
#include <stdlib.h> // Для функции abort()
#include <except.h> // Для функции поддержки исключений
#include <iostream.h> // Для потоков ввода-вывода
// Указатель на предыдущую функцию terminate:
void (*old_terminate)();
// Новая функция обработки неопознанного исключения:
void new_terminate()
{
cout << "\nВызвана функция new_terminate()";
// ... Действия, которые необходимо выполнить
// ... до завершения программы
abort (); // Завершение программы
}
int main (void)
{
// Установка своей функции обработки:
old_terminate = set_terminate(new_terminate);
// Генерация исключения вне контролируемого блока:
throw (25);
return 0;
}
Результат выполнения программы:
Вызвана функция new_terminate()
Вслед за этим программа завершается и выводит в окно сообщение: "Program Aborted!".
Вводимая программистом функция для обработки неопознанного исключения, во- первых, не должна формировать новых исключений, во-вторых, эта функция должна завершать программу и не возвращать управление вызвавшей ее функции terminate(). Попытка такого возврата приведет к неопределенным результатам.
Функция void unexpected ()вызывается, когда некоторая функция порождает исключение, отсутствующее в списке ее исключений. В свою очередь функцияunexpected ()по умолчанию вызывает функцию, зарегистрированную пользователем с помощью функцииset_unexpected(). Если такая функция отсутствует,unexpected()вызывает функциюterminate(). Функцияunexpected()не возвращает значения, однако может сама порождать исключения.
Функция set_unexpected()позволяет установить функцию, определяющую реакцию программы на неизвестное исключение. Эти действия определяются в функции, которая ниже поименована какunexpected_func(). Указанная функция специфицируется как функция типаunexpected_function. Этот тип определен в файлеexcept.hкак указатель на функцию без параметров, не возвращающую значения:
typedef void (*unexpected_function)();
unexpected_function sеt_unexpected (unexpected_function unexpected_func);
По умолчанию, неожиданное (неизвестное для функции) исключение вызывает функцию unexpected(), которая, в свою очередь вызывает либоunexpected_func()(если она определена), либоterminate()(в противном случае).
Функция set_unexpected()возвращает указатель на функцию, которая была установлена с помощьюset_unexpected()ранее. Устанавливаемая функция (unexpected_func) обработки неизвестного исключения не должна возвращать управление вызвавшей ее функцииunexpected(). Попытка возврата приведет к неопределенным результатам.
Кроме всего прочего, unexpected_func()может вызывать функцииabort(),exit()иterminate().
Глобальные переменные, относящиеся к исключениям:
__throwExceptionNameсодержит имя типа (класса) последнего исключения, порожденного программой;
__throwFileNameсодержит имя файла с исходным текстом программы, в котором было порождено последнее исключение;
__throwLineNumberсодержит номер строки в исходном файле, в которой создано порождение исключения.
Эти переменные определяются в файле except.hследующим образом:
extern char *__throwExceptionName;
extern char *__throwFileName;
extern unsigned __throwLineNumber;
Следующая программа демонстрирует возможности применения перечисленных глобальных переменных:
#include <except.h> // Описание переменных throwXXXX
#include <iostream.h> // Описание потоков ввода-вывода
class A // Определяем класс A
{
public:
void print () // Функция печати сведений об исключении
{
cout << "Обнаружено исключение ";
cout << __throwExceptionName;
cout << " в строке " << __throwLineNumber;
cout << " файла " << __throwFileName << endl;
}
}
class В : public A {}; // Класс В порождается из A
class С : public A {}; // Класс С порождается из А
С _с; // Создан объект класса С
void f() // Функция может порождать любые исключения
{
try
{ // Формируем исключение (объект класса С):
throw (_с);
}
catch (В X) // Здесь обрабатываются исключения типа В
{
X.print ();
}
}
int main ()
{
try
{ f(); } // Контролируемый блок
// Обрабатываются исключения типа А
// (и порожденных от него):
catch (A X)
{ X.print (); } // Обнаружено исключение
return 0;
}
Комментарии в тексте программы достаточно подробно описывают ее особенности. В выводимом на экран результате используются значения глобальных переменных.