Объектно-ориентированное программирование на C++ презентация

Содержание

Причины возникновения объектно-ориентированного программирования

Слайд 1Объектно-ориентированное программирование на C++


Слайд 2Причины возникновения объектно-ориентированного программирования


Слайд 3С ростом объема кода программы становится невозможным удерживать в памяти все

детали

Слайд 4Необходимо структурировать информацию, выделять главное и отбрасывать несущественное


Слайд 5Этот процесс называется повышением степени абстракции программы


Слайд 6Одним из естественных вариантов борьбы со сложностью является алгоритмическая декомпозиция -разбиение

задачи на подзадачи

Слайд 7Процедурное программирование –
подход, при котором исходная задача разбивается на подзадачи


Слайд 8Каждая подзадача оформляется в виде функции


Слайд 9Использование функций - первый шаг к повышению абстракции


Слайд 10Это позволяет отвлечься от деталей ее реализации, поскольку для вызова функции

требуется знать только ее интерфейс

Слайд 11Следующий шаг — описание собственных типов данных, позволяющих структурировать и группировать

информацию

Слайд 12Процедурное программирование –
подход, при котором функции и переменные, относящиеся к какому-то

конкретному объекту свободно располагаются в коде и никак между собой не связаны

Слайд 13Следующий шаг к повышению абстракции – объектно-ориентированный подход


Слайд 14Объектная декомпозиция –выделение сущностей из предметной области


Слайд 15Каждая сущность представляется в коде программы в виде класса


Слайд 16Класс - общее абстрактное описание некоторой сущности


Слайд 17Объектно-ориентированное программирование –
подход, при котором объекты реального мира представляются в

коде в виде экземпляров классов

Слайд 18Программа представляет собой совокупность взаимодействующих объектов, имеющих состояние и поведение


Слайд 19Интернет-магазин бытовой техники


Слайд 20Объектно-ориентированное программирование –
подход, при котором функции и переменные, относящиеся к

конкретному объекту объединены в коде и тесно связаны между собой

Слайд 21Концепция «черного ящика» является одной из базовых концепций ООП


Слайд 22Снаружи объект принято рассматривать как «черный ящик», т.е. некий прибор с

кнопками

Слайд 23Основные понятия ООП
Инкапсуляция

Наследование

Полиморфизм


Слайд 24Инкапсуляция –
это объединение полей и методов объекта в единое целое

- класс

Слайд 25Синтаксис объявления класса
class имя_класса
{
[private | protected | public]:
тип_поля1 имя_поля1;

тип_поля2 имя_поля2;
тип_поля3 имя_поля3;
...
тип1 имя_метода1(список_параметров)
{
...
}

тип2 имя_метода2(список_параметров)
{
...
}
...
} [список_переменных];

Слайд 26Способы доступа к компонентам класса
Открытый (public)

Защищенный (protected)

Закрытый (private)


Слайд 27Пример объявления класса


Слайд 28Важнейшее требование инкапсуляции - скрытие состояния объекта от внешнего мира


Слайд 29Инкапсуляция повышает степень абстракции программы


Слайд 30Данные класса и реализация методов класса находятся ниже уровня абстракции, и

для написания программы информация о них не требуется

Слайд 31Инкапсуляция позволяет изменить реализацию класса без модификации основной части программы, если

интерфейс остался прежним

Слайд 32Наследование –
это механизм, который позволяет расширять существующие классы, сохраняя их

функциональность и добавляя им новые свойства и методы

Слайд 33Полиморфизм –
это механизм, который позволяет использовать одно и тоже имя

для решения нескольких технически разных задач

Слайд 34Объект как экземпляр класса –
это некоторая уникальная единица, имеющая свои

переменные (поля) и функции (методы), эти переменные обрабатывающие

Слайд 35Поля объекта - это переменные, описывающие его состояние, а методы -

это способ перевести объект из одного состояния в другое

Слайд 36Пример создания объекта класса


Слайд 37Методы-аксессоры
Инспекторы позволяют получить значения полей

Модификаторы позволяют установить значения полей


Слайд 38Методы-аксессоры


Слайд 39Конструктор -
это специальный метод класса, который вызывается для конструирования объекта

в момент его создания

Слайд 40Конструктор не возвращает значение, даже типа void


Слайд 41Класс может иметь несколько конструкторов с разными параметрами для разных видов

инициализации

Слайд 42Конструктор, вызываемый без параметров, называется конструктором по умолчанию


Слайд 43Параметры конструктора могут иметь любой тип, кроме этого же класса


Слайд 44Если программист не указал ни одного конструктора, компилятор создаст его автоматически


Слайд 45Деструктор –
это специальный метод класса, который вызывается при уничтожении объекта


Слайд 46Деструктор не принимает никаких параметров и не возвращает значений


Слайд 47Класс может иметь только один деструктор


Слайд 48Если деструктор явным образом не определен, компилятор автоматически создаст пустой деструктор


Слайд 49this – константный указатель на объект класса, который неявно передается в

каждый нестатический метод класса

Слайд 50Конструктор копирования


Слайд 51Три ситуации, когда новый объект конструируется путем копирования существующего
Объект создается и

инициализируется другим объектом
Объект передается в функцию по значению
Объект возвращается из функции по значению

Слайд 52Объект создается и инициализируется другим объектом


Слайд 53Объект передается в функцию
по значению


Слайд 54Объект возвращается из функции по значению


Слайд 55Если в объекте класса есть указатель, адресующий участок динамической памяти, то

создается предпосылка возникновения ошибки на этапе выполнения программы

Слайд 56Объект создается и инициализируется другим объектом


Слайд 57Объект передается в функцию
по значению


Слайд 58Объект возвращается из функции по значению


Слайд 59При поэлементном копировании указатели двух различных объектов будут адресовать один и

тот же участок динамической памяти

Слайд 60При разрушении одного из объектов сработает деструктор, который освободит динамическую память


Слайд 61При разрушении второго объекта снова сработает деструктор, который попытается повторно удалить

ранее освобожденный участок динамической памяти

Слайд 62Произойдет ошибка этапа выполнения программы


Слайд 63Для решения данной проблемы необходимо обеспечить класс собственной реализацией конструктора копирования


Слайд 64В конструкторе копирования необходимо выделить память для указателя вновь создаваемого объекта


Слайд 65Конструктор копирования


Слайд 66Статические элементы класса


Слайд 67Статические поля класса – это глобальные переменные, доступные только в пределах

области класса

Слайд 68Статические поля применяются для хранения данных, общих для всех объектов класса


Слайд 69Эти поля существуют для всех объектов класса в единственном экземпляре, то

есть не дублируются

Слайд 70Статические поля класса должны быть определены глобально после описания класса


Слайд 71В этом случае под них будет выделено соответствующее количество байт памяти


Слайд 72Статические поля класса


Слайд 73Статические поля доступны как через имя класса, так и через имя

объекта

Слайд 74На статические поля распространяется действие спецификаторов доступа


Слайд 75Память, занимаемая статическим полем, не учитывается при определении размера объекта с

помощью операции sizeof

Слайд 76Статические методы предназначены для обращения к статическим полям класса


Слайд 77Статическим методам не передается скрытый указатель на объект класса (this)


Слайд 78Поэтому они могут обращаться непосредственно только к статическим полям и вызывать

только статические методы класса

Слайд 79Статические элементы класса


Слайд 80Обращение к статическим методам производится либо через имя класса, либо через

имя объекта

Слайд 81Перегрузка операторов


Слайд 82Перегрузка операторов – возможность интегрировать пользовательский тип данных в язык программирования


Слайд 83Перегрузка операторов дает возможность определить собственные действия для стандартных операций, применяемых

к объектам пользовательского типа

Слайд 84Общий синтаксис перегрузки
операторов


Слайд 85Ограничения
Нельзя перегружать операции для стандартных типов
Нельзя создавать новые названия операций
Перегрузка не

меняет приоритет операций
В С++ нет неявной перегрузки операций
Для той или иной операции нельзя изменить количество операндов

Слайд 86Запрещенные к перегрузке операторы
:: - оператор разрешения области видимости
sizeof

- оператор определения размера объекта
. - оператор выбора
?: - условный тернарный оператор

Слайд 87Способы перегрузки операторов
Функция-операция представляется в виде метода класса
Функция-операция представляется в виде

обычной или дружественной функции

Слайд 88Дружественные функции


Слайд 89Функция, объявленная в классе с ключевым словом friend, является дружественной по

отношению к данному классу

Слайд 90Это означает, что данная функция имеет прямой доступ к скрытым полям

класса

Слайд 91Поскольку дружественной функции не передается указатель this, то она должна принимать

в качестве параметра ссылку на объект класса

Слайд 92Дружественные функции


Слайд 93На дружественные функции не распространяются спецификаторы доступа


Слайд 94Одна функция может быть дружественной сразу нескольким классам


Слайд 95Другом может быть не только функция, но и метод другого ранее

определенного класса

Слайд 96Дружественные методы


Слайд 97Если все методы какого-либо класса должны иметь доступ к скрытым полям

другого, то весь класс объявляется дружественным

Слайд 98Дружественный класс


Слайд 99Важно понимать, что класс сам определяет, какие функции и классы являются

дружественными, а какие нет

Слайд 100Шаблоны функций


Слайд 101Шаблоны используются, когда необходимо создать функции, которые применяют один и тот

же алгоритм к различным типам данных

Слайд 102Шаблон функции – это обобщенное описание функции


Слайд 103У такой функции хотя бы один формальный параметр имеет обобщенный тип


Слайд 104Определение шаблона
функции


Слайд 105Использование шаблона функции


Слайд 106В момент вызова функции компилятор автоматически создает специализированную версию функции, где

вместо параметра типа подставляется конкретный тип данных

Слайд 107Этот процесс называется инстанцированием шаблона или созданием экземпляра шаблона


Слайд 108Повторный вызов функции с теми же типами параметров не спровоцирует генерацию

дополнительной копии функции, а вызовет уже существующую

Слайд 109Использование шаблона функции


Слайд 110Определение шаблона функции не вызывает самостоятельную генерацию кода компилятором


Слайд 111По этой причине реализацию шаблонов функций следует размещать в заголовочном файле


Слайд 112Компилятор создает код функции только в момент ее вызова, и генерирует

при этом соответствующую версию функции

Слайд 113Каждый параметр типа, который встречается в угловых скобках, должен обязательно появиться

в списке параметров функции

Слайд 114В противном случае произойдет ошибка этапа компиляции


Слайд 115Определение шаблона
функции


Слайд 116Перегруженные шаблоны


Слайд 117Явная специализация шаблона


Слайд 118Специализация переопределяет шаблон, а обычная нешаблонная функция переопределяет и специализацию, и

шаблон

Слайд 120Важно понимать, что использование шаблонов функций не приводит к уменьшению результирующего

объектного кода

Слайд 121Однако экономит время разработки программы


Слайд 122Динамические структуры данных


Слайд 123При решении большинства реальных современных задач для хранения данных приходится использовать

динамическую память

Слайд 124До сих пор мы пользовались обычными динамическими массивами


Слайд 125При добавлении и удалении элементов массива приходилось перераспределять память


Слайд 126Динамический массив предполагает такой способ хранения информации, при котором можно получить

произвольный доступ к любому элементу массива по индексу

Слайд 127Произвольный доступ к элементам является специфической особенностью массива как динамической структуры

данных

Слайд 128Такой способ хранения информации является наиболее часто используемым, но не единственным


Слайд 129Динамическая структура данных – структура данных определенного формата с определенным способом

доступа к ее элементам и автоматическим расширением размера при необходимости

Слайд 130Каждая динамическая структура данных имеет определенный набор операций с ее элементами


Слайд 131Наиболее часто используемые динамические структуры данных
Стек
Очередь
Связный список
Бинарное дерево


Слайд 132Стек - это динамическая структура данных, которая функционирует по принципу LIFO

(Last In First Out)

Слайд 133Работа стека организована таким образом, что элементы добавляются и удаляются с

одного конца, называемого вершиной стека

Слайд 134Кроме того, стек обладает базовым адресом - начальным адресом, по которому

стек размещается в памяти

Слайд 135Динамическая структура данных «Стек»


Слайд 136Основные операции над стеком и его элементами
Добавление элемента в стек
Удаление элемента

из стека
Просмотр элемента в вершине стека без удаления
Очистка стека

Слайд 137Добавление элемента в стек


Слайд 138Удаление элемента из стека


Слайд 139Просмотр элемента в вершине стека без удаления


Слайд 140Очистка стека


Слайд 141Важно понимать, что стек не определяет новый способ хранения данных в

памяти, а предоставляет новый способ доступа к данным

Слайд 142Стек широко используются в системном программном обеспечении, включая компиляторы и интерпретаторы


Слайд 143Очередь - это динамическая структура данных, которая функционирует по принципу FIFO

(First In First Out)

Слайд 144Очередь чаще всего используется в задачах моделирования различных систем обслуживания


Слайд 145Разновидности очереди
Классическая очередь

Кольцевая очередь

Очередь с приоритетом


Слайд 146Классическая очередь


Слайд 147Кольцевая очередь


Слайд 148Очередь с приоритетом


Слайд 149Очередь с приоритетом


Слайд 150Важно понимать, что очередь не определяет новый способ хранения данных в

памяти, а предоставляет новый способ доступа к данным

Слайд 151Односвязный список


Слайд 152Основной способ хранения информации, который используется в программах - это массивы


Слайд 153При использовании массивов наиболее эффективно выполняются операции доступа к элементам (чтение/изменение)


Слайд 154В то время как операции вставки/удаления будут значительно менее эффективны


Слайд 155В задачах, где операции вставки/удаления используются намного чаще, чем операции чтения/изменения,

использование массивов оказывается неэффективным

Слайд 156Для решения этой проблемы используются такие динамические структуры данных как связные

списки

Слайд 157Односвязный список — это набор элементов, связанных между собой с помощью

указателя-связки

Слайд 158Односвязный список


Слайд 159Принципиальное отличие списка от массива заключается в том, что элементы списка

хранятся не одним блоком в памяти, а каждый отдельно

Слайд 160Список вынужден хранить не только сами данные, но дополнительную служебную информацию


Слайд 161Такой служебной информацией в списке является указатель на следующий элемент (next)


Слайд 162Этот указатель связывает хранящиеся отдельно в памяти элементы списка в единую

динамическую структуру

Слайд 163Связь между элементами списка однонаправленная, поэтому список называется односвязным


Слайд 164В качестве точки входа в список используется указатель на его первый

элемент, называемый головой списка (head)

Слайд 165Вставка узла в определенное место списка


Слайд 166Удаление узла из списка


Слайд 167Именно благодаря такой структуре списка, в нем весьма эффективно осуществляются операции

вставки/удаления элементов

Слайд 168Однако, скорость доступа к элементам у списка ниже, чем у массива


Слайд 169Двусвязный список


Слайд 170Недостаток односвязного списка – однонаправленная связь между его элементами


Слайд 171Из первого элемента списка попасть во второй можно, а обратно уже

нет

Слайд 172Вместо этого придется заново перебирать все элементы, начиная с головы списка,

что приводит к потере производительности

Слайд 173Для решения этой проблемы следует добавить в каждый элемент списка еще

одно служебное поле

Слайд 174В этом поле будет храниться указатель на предыдущий элемент (previous)


Слайд 175Тогда из любого элемента списка можно будет попасть не только в

следующий за ним элемент в списке, но и в предыдущий

Слайд 176Двусвязный список


Слайд 177Такая структура предоставляет возможность двунаправленно перебирать список


Слайд 178Первый элемент двусвязного списка называется головой списка (head)


Слайд 179Последний элемент двусвязного списка называется хвостом списка (tail)


Слайд 180Вставка узла в определенное место двусвязного списка


Слайд 181Удаление узла из двусвязного списка


Слайд 182Бинарные деревья поиска


Слайд 183Бинарное дерево – это структурированная совокупность узлов, каждый из которых может

иметь одного предка и двух потомков

Слайд 184Под предком понимают родительский узел, а потомком называют дочерний узел


Слайд 185Бинарное дерево – это динамическая структура данных, в которой элементы изначально

упорядочены

Слайд 186Каждый узел бинарного дерева помимо данных имеет ключ, который однозначно идентифицирует

узел

Слайд 187Бинарное дерево поиска


Слайд 188Для каждого узла бинарного дерева в левой ветке содержатся только те

ключи, которые имеют значения, меньшие, чем значение данного узла

Слайд 189Для каждого узла в правой ветке содержатся ключи, имеющие значения, большие

(или равные), чем значение данного узла

Слайд 190Бинарное дерево эффективно используется для поиска информации


Слайд 191Однако, в этом случае бинарное дерево должно быть сбалансированным – расти

в ширину, а не в высоту

Слайд 192Если бинарное дерево не сбалансировано, то поиск данных будет достаточно долгим


Слайд 193В отличие от массива бинарное дерево хранит отсортированную информацию не в

линейном виде, а в иерархическом

Слайд 194Узел, который не имеет предка, является корнем бинарного дерева


Слайд 195Узел, который не имеет потомков, называется листом


Слайд 196Бинарное дерево поиска


Слайд 197Структура узла
бинарного дерева


Слайд 198Добавление узла в
бинарное дерево


Слайд 199При добавлении узел вставляется в дерево таким образом, что дерево не

нужно специально сортировать

Слайд 200Узел сразу вставляется в «правильную» позицию, причем такая позиция единственная


Слайд 201При удалении узла из дерева возможны три ситуации


Слайд 202Если удаляемый узел дерева является листом, то удаление такого узла является

тривиальной задачей

Слайд 203Удаление узла из дерева


Слайд 204Если удаляемый узел имеет только одного потомка, тогда дочерний узел напрямую

соединяется с родительским узлом

Слайд 205Удаление узла из дерева


Слайд 206Если удаляемый узел имеет двух потомков, тогда отыскивается следующий узел дерева

и данные из него копируются в удаляемый узел, после чего следующий узел удаляется из дерева

Слайд 207Удаление узла из дерева


Слайд 208Агрегация и композиция


Слайд 209Агрегирование (агрегация) –
это включение объекта (объектов) одного класса в состав

объекта другого класса

Слайд 210Агрегация — отношение между двумя равноправными объектами, при котором один объект

(контейнер) имеет ссылку на другой объект

Слайд 211Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его

содержимое — нет

Слайд 212Пример отношения агрегации


Слайд 213Пример отношения агрегации


Слайд 214Композиция — более строгий вариант агрегации, когда включаемый объект может существовать

только как часть контейнера

Слайд 215Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен


Слайд 216Пример отношения композиции


Слайд 217Пример отношения композиции


Слайд 218Пример отношения агрегации и композиции


Слайд 219Наследование


Слайд 220Наследование – механизм языка С++, который позволяет расширять существующие классы, сохраняя

их функциональность и добавляя им новые свойства и методы

Слайд 221Класс, от которого наследуются называют базовым классом


Слайд 222Класс, который наследует некоторый класс называют классом-наследником или производным классом


Слайд 223Таким образом, наследование позволяет повторно использовать уже написанный код, расширяя и

дополняя его при необходимости новыми функциональными возможностями

Слайд 224Общий синтаксис
наследования
class : [спецификатор наследования]

{

класса>
};

[спецификатор наследования] =
public | protected | private

Слайд 225Спецификатор наследования определяет каким будет в производном классе доступ к полям

базового класса

Слайд 226Если спецификатор наследования не указан, то по умолчанию для классов будет

private, а для структур - public

Слайд 227Пример наследования


Слайд 228Спецификаторы доступа


Слайд 229Важно понимать, что все унаследованные private-поля хотя и недоступны непосредственно в

объектах производного класса, но всё равно содержатся в них

Слайд 230Конструкторы и деструкторы не наследуются


Слайд 231При создании объекта производного класса вызываются конструкторы всех классов иерархии, начиная

с самого верхнего и заканчивая конструктором этого производного класса

Слайд 232Деструкторы, соответственно, вызываются в обратном порядке


Слайд 235Для инициализации унаследованных полей базового класса в производном классе следует использовать

конструктор базового класса

Слайд 241В конструкторе производного класса следует явно инициализировать только новые поля, которые

не были унаследованы от базового класса

Слайд 242При помощи списка инициализаторов мы сообщаем компилятору какой именно конструктор следует

вызвать

Слайд 243Если необходимо изменить функциональность производного класса относительно базового класса, то используется

переопределение методов

Слайд 244Если в производном классе имеется метод с таким же именем и

сигнатурой, как и в базовом классе, такой метод считается переопределённым

Слайд 248Если в производном классе имеется метод с точно таким же именем

как и в базовом классе, но различной сигнатурой, то такой метод называется замещённым

Слайд 252Множественное наследование


Слайд 253При множественном наследовании производный класс наследуется от нескольких базовых классов


Слайд 254Пример множественного наследования


Слайд 255При множественном наследовании порядок вызова конструкторов базовых классов определяется не списком

инициализаторов, а порядком, в котором указаны базовые классы при объявлении производного класса

Слайд 256Порядок вызова конструкторов


Слайд 257Деструкторы вызываются в порядке, обратном порядку вызова конструкторов


Слайд 258Главной проблемой множественного наследования являются конфликты имен


Слайд 259Конфликты имен


Слайд 260Для решения этой проблемы необходимо использовать операцию разрешения контекста для доступа

к полям в производном классе

Слайд 261Решение проблемы конфликта имен


Слайд 262«Ромбовидное» наследование


Слайд 263Проблема «ромбовидного» наследования состоит в том, что в производном классе D

дублируется поле из класса A

Слайд 264Для решения проблемы необходимо класс A сделать виртуальным базовым классом и

обеспечить его конструктором по умолчанию

Слайд 265Решение проблемы «ромбовидного» наследования


Слайд 266При создании объекта производного класса в цепочке вызовов конструкторов сначала вызываются

конструкторы по умолчанию виртуальных базовых классов, в порядке следования слева направо, а затем все остальные конструкторы

Слайд 267Полиморфизм


Слайд 268Механизм раннего связывания


Слайд 270Механизм раннего связывания


Слайд 271Поскольку тип объектной переменной известен на этапе компиляции программы, то связывание

вызова метода с самим кодом метода происходит на этапе построения программы

Слайд 272Такое связывание называется ранним связыванием


Слайд 273Механизм наследования позволяет записывать адрес объекта производного класса в указатель на

базовый класс

Слайд 274Через указатель на базовый класс можно работать с объектом производного класса,

но только с той частью, которая была унаследована из базового

Слайд 275Это позволяет абстрагироваться от конкретного объекта, от конкретной реализации


Слайд 276Это дает возможность выбирать любую реализацию во время выполнения программы


Слайд 277Т.е. работать с любым объектом через указатель на базовый класс


Слайд 279При работе с объектом производного класса через указатель на базовый класс

связывание вызова метода с самим кодом метода происходит на этапе построения программы

Слайд 280В результате вызывается метод класса, соответствующий типу указателя, а не типу

объекта, который адресуется через данный указатель

Слайд 281Это, по-прежнему, раннее связывание


Слайд 282При работе с объектом производного класса через указатель на базовый класс

желательно, чтобы связывание вызова метода с самим кодом метода происходило на этапе выполнения программы

Слайд 283Необходимо, чтобы вызывался метод в соответствии с типом объекта, а не

типом указателя, который адресует данный объект

Слайд 284Для решения данной проблемы в базовом классе переопределяемый метод объявляется как

виртуальный

Слайд 285В производных классах этот виртуальный метод переопределяется


Слайд 286Класс, который содержит хотя бы один виртуальный метод, называется полиморфным


Слайд 289Для каждого класса иерархии, в котором определяется или переопределяется виртуальный метод,

компилятор создаёт таблицу виртуальных функций

Слайд 290В этой таблице содержатся адреса всех виртуальных методов в порядке их

описания в классе

Слайд 291 Адрес любого виртуального метода имеет в таблице одно и то

же смещение для каждого класса в пределах иерархии

Слайд 292Каждый объект полиморфного класса содержит дополнительное поле-указатель vptr на таблицу виртуальных

функций

Слайд 293Этот указатель vptr заполняется конструктором при создании объекта


Слайд 294На этапе компиляции программы все обращения к виртуальным методам заменяются на

обращения к таблице через vptr объекта

Слайд 295На этапе выполнения в момент обращения к виртуальному методу его адрес

выбирается из таблицы и выполняется вызов

Слайд 296В этом и заключается механизм позднего связывания


Слайд 297Механизм позднего
связывания


Слайд 298Таким образом, вызов виртуального метода, в отличие от обычных методов, выполняется

через дополнительный этап получения адреса метода из таблицы виртуальных функций

Слайд 299В производных классах переопределённые виртуальные методы не обязательно объявлять с ключевым

словом virtual

Слайд 300Отсюда вытекает правило виртуальности: метод, объявленный виртуальным в некотором классе, остается

виртуальным во всех его потомках

Слайд 301Если в базовом классе имеется виртуальный метод, то в производном классе

метод с таким же именем и сигнатурой автоматически становится виртуальным

Слайд 302Виртуальный метод не может быть статическим, однако может быть другом в

некотором классе

Слайд 303Объект, который адресуется через указатель или ссылку и имеет хотя бы

один виртуальный метод, называется полиморфным

Слайд 304Виртуальный метод, объявленный в базовом классе, наследуется производными классами


Слайд 305Поэтому переопределять его следует только в том случае, если необходимо задать

отличающиеся действия

Слайд 308Абстрактный базовый класс


Слайд 309 Чаще всего базовые классы предназначены для представления общих понятий, которые

предполагается конкретизировать в производных классах

Слайд 310 Очевидно, что объекты таких классов создавать бессмысленно (например, класс figure)


Слайд 311 Базовый класс важен исключительно как абстрактный класс, определяющий общие принципы

работы его потомков

Слайд 312 В языке C++ существует возможность зафиксировать эту абстрактность на уровне

самого языка

Слайд 313 Для этого используются чисто виртуальные функции


Слайд 314Чисто виртуальный метод –
это метод, который в базовом классе

только объявляется, но не определяется

virtual void calculateArea ()=0;

Слайд 316Базовый класс, который содержит хотя бы один чисто виртуальный метод называется

абстрактным базовым классом

Слайд 317Абстрактный класс может использоваться только в качестве базового для других классов

— объекты абстрактного класса создавать нельзя

Слайд 318Однако можно создавать указатель или ссылку на абстрактный базовый класс


Слайд 319Абстрактный класс можно рассматривать как заготовку, в которой часть функциональности реализована,

а оставшаяся часть делегирована потомкам

Слайд 320Важно понимать, что производный класс, который наследуется от абстрактного базового класса,

должен переопределить все чисто виртуальные методы

Слайд 321В противном случае производный класс также будет считаться абстрактным


Слайд 322Таким образом, можно создать функцию, параметром которой является указатель на абстрактный

класс

Слайд 323На место этого параметра при выполнении программы может передаваться указатель на

объект любого производного класса

Слайд 324 Это позволяет создавать полиморфные функции, работающие с объектом любого типа

в пределах одной иерархии

Слайд 325Полиморфная функция


Слайд 326Таким образом, полиморфизм предполагает один интерфейс и множество реализаций


Слайд 327 Динамическая идентификация
типов (Run-Time Type Identification, RTTI)


Слайд 328 Механизм идентификации типа во время выполнения программы позволяет определять, на

какой тип в текущий момент времени ссылается указатель

Слайд 329 Для доступа к RTTI в стандарт языка введен оператор typeid

и класс type_info

Слайд 330 Формат оператора typeid:
typeid (тип)
typeid (выражение)


Слайд 331 Оператор принимает в качестве параметра имя типа или выражение и

возвращает ссылку на объект класса type_info, содержащий информацию о типе

Слайд 334 Операторы == и != позволяют сравнивать два объекта на равенство

и неравенство

Слайд 335 Метод name() возвращает указатель на строку, представляющую имя типа, описываемого

объектом класса type_info

Слайд 336 Полиморфное приведение типов с использованием оператора dynamic_cast


Слайд 337 Оператор dynamic_cast
применяется для преобразования указателей родственных классов иерархии


Слайд 338 Чаще всего dynamic_cast применяется для преобразования указателя базового класса в

указатель на производный

Слайд 339 Формат оператора:
dynamic_cast (выражение)


Слайд 340 При этом во время выполнения программы производится проверка допустимости преобразования


Слайд 341 Для того чтобы проверка допустимости могла быть выполнена, аргумент оператора

dynamic_cast должен быть полиморфного типа, т.е. иметь хотя бы один виртуальный метод

Слайд 342 Если преобразование оказалось некорректным, то оно не выполняется, и оператор

вернет нулевой указатель

Слайд 346 Обработка исключительных ситуаций


Слайд 347 Исключение – это временный объект, создаваемый программой в случае возникновения

ошибки

Слайд 348 Исключение будет существовать до тех пор, пока его не обработают


Слайд 349 Синтаксис создания (вбрасывания) исключения:

throw значение;


Слайд 350 Исключение может быть объектом любого типа - как стандартного, так

и пользовательского

Слайд 351 Механизм обработки исключений - это способ обработки ошибок средствами языка

C++

Слайд 352 Синтаксис обработки исключений
try
{
// код, подлежащий проверке на наличие

ошибок
throw <выражение>
//генерация исключения указанного типа
}
catch(<тип_исключения>)
{
//обработка исключения
}

Слайд 353 Файловый ввод/вывод средствами языка С++


Слайд 354 Поток — это абстрактное понятие, относящееся к любому переносу данных

от источника к приемнику

Слайд 355 Поток определяется как последовательность байтов и не зависит от конкретного

устройства, с которым производится обмен

Слайд 356 Физическим устройством может быть клавиатура, монитор, файл, оперативная память, принтер

и т.д.

Слайд 357 Обмен с потоком для увеличения скорости передачи данных производится,

как правило, через специальную область оперативной памяти — буфер потока

Слайд 358 Фактическая передача данных выполняется при выводе после заполнения буфера,

а при вводе — если буфер исчерпан

Слайд 359 При этом чтение данных из потока называется извлечением, а вывод

данных в поток — включением

Слайд 360Вывод данных в поток


Слайд 361Чтение данных из потока


Слайд 362 По направлению обмена потоки можно разделить на входные, выходные и

двунаправленные

Слайд 363 Входные потоки - потоки, из которых читаются данные


Слайд 364 Выходные потоки - потоки, в которые записываются данные


Слайд 365 Двунаправленные потоки - потоки, допускающие как чтение, так и запись


Слайд 366 Стандартная библиотека содержит три класса для работы с файлами:
ifstream

— класс входных файловых потоков
ofstream— класс выходных файловых потоков
fstream — класс двунаправленных файловых потоков

Слайд 367 Эти классы являются производными от классов istream, ostream и iostream

соответственно

Слайд 368 Объект класса ifstream представляет собой входной файловый поток для чтения

информации из файла

Слайд 369 Объект класса ofstream представляет собой выходной файловый поток для записи

информации в файл

Слайд 370 Объект класса fstream представляет собой двунаправленный файловый поток для чтения

и записи

Слайд 371 Режимы открытия файла


Слайд 372 Стандартная библиотека С++


Слайд 373 Стандартная библиотека шаблонов (STL) (Standard Template Library) - это составная часть

стандартной библиотеки языка С++

Слайд 374STL - это набор шаблонных классов и функций общего назначения, реализующих

наиболее популярные структуры данных и часто употребительные алгоритмы работы с ними

Слайд 375Архитектура STL была разработана Александром Степановым и Менг Ли


Слайд 376STL состоит из следующих компонентов:

контейнеры (containers)
адаптеры (adaptors)
итераторы (iterators)
алгоритмы (algorithms)
функторы (functors)
предикаты

(predicates)

Слайд 377Контейнер предназначен для хранения набора объектов в памяти


Слайд 378Два основных типа контейнеров: последовательные и ассоциативные


Слайд 379Последовательный контейнер – упорядоченная коллекция, в которой каждый элемент имеет определенную

позицию (vector, list)

Слайд 380Позиция зависит от места вставки, но не зависит от значения элемента


Слайд 381Ассоциативный контейнер –коллекция элементов, в которой позиция элемента зависит от его

значения и выбранного критерия сортировки (map, set)

Слайд 382Такой контейнер всегда находится в отсортированном состоянии, что ускоряет выполнение поиска


Слайд 383Адаптер – специализированный контейнер, который предоставляет определенный интерфейс для доступа к

данным (stack, queue)

Слайд 384Итератор – это специальный указатель, который используется для перемещения по контейнеру

и для манипулирования объектами, находящимися в контейнере

Слайд 385Итераторы делятся на 5 категорий:
итератор ввода
итератор вывода
прямой итератор
двусторонний

итератор
итератор произвольного доступа

Слайд 386Итератор ввода (InputIterator) перемещается только вперед и поддерживает только чтение


Слайд 387Итератор вывода (OutputIterator) перемещается только вперед и поддерживает только запись


Слайд 388Прямой итератор (ForwardIterator) перемещается только вперед, позволяет выполнять чтение и запись


Слайд 389Двусторонний итератор (BidirectionalIterator) - прямой итератор, который поддерживает перебор элементов в

обратном порядке

Слайд 390Итератор произвольного доступа (RandomAccessIterator) имеет все свойства двустороннего итератора, а также

поддерживает произвольный доступ к элементам

Слайд 391Алгоритмы – функции, которые используются для обработки элементов в контейнере (например,

сортировка, поиск)

Слайд 392Алгоритмы используют итераторы


Слайд 393Так как каждый класс контейнера имеет итератор, один и тот же

алгоритм может работать с различными контейнерами

Слайд 394Функторы – это объекты, действующие как функции, они могут быть объектами

класса или указателями на функцию

Слайд 395Функторы позволяют выполнять конфигурирование алгоритмов для специального использования


Слайд 396Предикаты - функции, которые проверяют, удовлетворяет ли объект заданным критериям, и

возвращают значение типа bool

Слайд 397Предикаты используются, например, в поисковых алгоритмах для задания более сложного критерия

поиска

Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика