- •Структура дисциплины
- •Процедурное программирование
- •Объектно-ориентированное программирование
- •Обобщенное программирование
- •На пути к объектно-ориентированному программированию
- •Абстракция сущностей и процедурный язык программирования
- •Абстрактный тип данных
- •Организация класса
- •Определение и объявление класса
- •Члены класса
- •Маркеры доступа
- •Конструкторы
- •Понятие об объекте
- •Организация кода при работе с классами
- •Статические компоненты класса
- •Конструкторы. Детальное рассмотрение
- •Функции getter и setter
- •Виды отношений между классами
- •Отношение зависимость
- •Отношение целое / часть
- •Разработка класса b_1.
- •Конструктор умолчания.
- •Конструктор с параметрами
- •Конструктор копирования.
- •Деструктор
- •Реализация класса b_2_1.
- •Дружественные функции и дружественные классы
- •Особенности применения дружественных функций и классов
- •Перегрузка оператров
- •Перегрузка оператора присваивания
- •Реализация перегруженного оператора присваивания для класса Array
- •Перегрузка оператора индексирования
- •Понятие о константной функции
- •Константный вариант перегруженного оператора индексирования
- •Вычисление смешанных выражений
- •Наследование
- •Структура объекта порожденного класса
- •Доступ к элементам базового класса
- •Конструкторы порожденного класса
- •Порядок создания объекта порожденного класса
- •Перегруженный оператор присваивания порожденного класса
- •Вызов виртуальной функции из тела невиртуальной функции
- •Виртуализация функций не-членов класса
- •Идиома невиртуального интерфейса (nvi)
- •Реализация механизма виртуальных функций
- •Накладные расходы при работе с виртуальными функциями
- •Чисто виртуальные функции. Абстрактные базовые классы
- •Виртуальные деструкторы
- •Автономные и базовые классы
- •Чисто виртуальный деструктор
- •Дублирование подобъектов
- •Конструкторы при виртуальном наследовании
- •Работа с данными при виртуальном наследовании
- •Обработка исключительных ситуаций
- •Завершение или продолжение
- •Распределение обязанностей между разработчиком и клиентом
- •Генерация исключений
- •Объект исключения
- •Раскрутка стека
- •Спецификации исключений
- •Работа с обработчиками
- •Формат обработчика
- •Пример обработки исключений
- •Современная точка зрения на спецификации исключения
- •Шаблоны функций
- •Объявление и определение шаблона функции
- •Примеры объявлений и определений шаблонов функций
- •Инстанцирование шаблона функции
- •Неявное инстанцирование
- •Явное инстанцирование конкретной функции
- •Структура использования шаблона функции с явным инстанцированием
- •Перегрузка шаблона функции
- •Явная специализация шаблона функции
- •Шаблоны классов
- •Использование шаблона класса
- •Наследование и шаблоны
- •Шаблоны классов и отношение включения
- •Рекурсивное использование шаблонов классов
- •Друзья и шаблоны классов
- •Явная и частичная специализация шаблона класса
- •Алгоритмы
- •Алгоритм for_each
- •Функциональные объекты
- •Алгоритм copy
- •Алгоритм sort
- •Термины и определения
- •.Литература
Абстрактный тип данных
Несмотря на широкое использование этого понятия, его единая трактовка отсутствует. Некоторые авторы под абстрактным типом данных (АТД) понимают математическую модель абстракции. Несомненно, построение математической модели абстракции позволило бы построить ее описание. Наиболее последовательно этот подход представлен в книге Бертрана Мейера[21].
Спецификация АТД, которая предлагается Бертраном Мейером в несколько упрощенном виде состоит из четырех разделов:
-
наименование типа.
-
прототипы функций.
-
аксиомы.
-
предусловия.
Назначение первого раздела не требует пояснения. Второй раздел определяет интерфейс, предоставляемый АТД. Третий раздел предназначен для описания функциональности АТД. Последний раздел спецификаций определяет условия, которые должен обеспечить клиент АТД
Реализация абстракции сущности требует наличия аппарата, который позволял бы программисту разрабатывать собственные типы данных. Такой аппарат предоставляет объектно-ориентированное программирование. Попытаемся ответить на вопрос: можно ли оставаясь в рамках процедурного языка, например языка С, реализовать пользовательский тип данных.
Для работы с абстракциями общего вида, которыми являются абстракции сущности, часто используются понятие абстрактного типа данных.
Рассмотрим несколько упрощенно процесс абстрагирования. В нем можно выделить три задачи. Целью первой из них является отделение в исследуемом объекте основных характеристик от характеристик второстепенных. Эту задачу можно считать решенной в тот момент, когда интерфейс объекта ока
Понятие абстрактного типа данных (АТД) широко применяется на практике. Однако различные авторы по-разному определяют это понятие. Некоторые из них под АТД понимают математическую модель абстракции [20]. Очень важным является то обстоятельство, что нет необходимости пересматривать модель при смене реализации и более того это не надо делать при переходе на другой язык программирования. Построив такую модель, можно познакомиться с интересующей вас сущностью. Такое определение АТД чрезвычайно полезно. Полезность его в полной независимости от реализации. Однако имеется и существенный недостаток. Оно не позволяет ответить на вопрос: можно ли реализовать рассматриваемую абстракцию на конкретном языке программирования.
/* Файл Stack.h */ struct Stack { double *ptemp; int size; int top; }; void allocate_memory(struct Stack* p, int size) { p -> size = size; p -> ptemp = (double*)malloc(sizeof(double) * size); p -> top = -1; } void free_memory(struct Stack* p) { free(p -> ptemp); }
Организация класса
В языке С++ классы предназначены для частичной или полной реализации пользовательского типа (абстрактного типа данных). Различают конкретные и абстрактные классы. Конкретные классы предназначены для создания объектов. С помощью конкретных классов создаются пользовательские типы данных. Абстрактные классы не позволяют создавать объекты. В настоящем разделе рассматриваются конкретные классы.
Класс языка С++ является развитием (обобщением) структур языка С. Класс отличается от структуры в следующих отношениях:
-
В классе объединяются не только данные (как это имеет место в структуре), но и функции.
-
Элементы класса наделяются правами доступа.
-
Класс наделяется отдельной областью видимости.