Similar presentations:
Объектно-ориентированное программирование на 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.
Если деструктор явным образомне определен, компилятор
автоматически создаст пустой
деструктор
49.
this – константный указатель наобъект класса, который неявно
передается в каждый
нестатический метод класса
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.
Общий синтаксис перегрузкиоператоров
тип operator знак_операции (параметры)
{
< тело функции >
}
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.
Специализация переопределяетшаблон, а обычная нешаблонная
функция переопределяет и
специализацию, и шаблон
119.
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.
Пример отношения композицииОкно программы
1
1
Заголовок
1
2
Полоса
прокрутки
1
1
1
Рабочая
область
1
Главное
ме ню
217.
Пример отношения композиции218.
Пример отношения агрегациии композиции
219.
Наследование220.
Наследование – механизм языкаС++, который позволяет расширять
существующие классы, сохраняя
их функциональность и добавляя
им новые свойства и методы
221.
Класс, от которого наследуютсяназывают базовым классом
222.
Класс, который наследуетнекоторый класс называют
классом-наследником или
производным классом
223.
Таким образом, наследованиепозволяет повторно использовать
уже написанный код, расширяя и
дополняя его при необходимости
новыми функциональными
возможностями
224.
Общий синтаксиснаследования
class <имя производного класса>:
[спецификатор наследования]
<имя базового класса>
{
<элементы класса>
};
[спецификатор наследования] =
public | protected | private
225.
Спецификатор наследованияопределяет каким будет в
производном классе доступ к
полям базового класса
226.
Если спецификатор наследованияне указан, то по умолчанию для
классов будет private, а для
структур - public
227.
Пример наследования228.
Спецификаторы доступа229.
Важно понимать, что всеунаследованные private-поля хотя
и недоступны непосредственно в
объектах производного класса, но
всё равно содержатся в них
230.
Конструкторы и деструкторыне наследуются
231.
При создании объектапроизводного класса
вызываются конструкторы всех
классов иерархии, начиная с
самого верхнего и заканчивая
конструктором этого
производного класса
232.
Деструкторы, соответственно,вызываются в обратном порядке
233.
234.
235.
Для инициализацииунаследованных полей базового
класса в производном классе
следует использовать
конструктор базового класса
236.
237.
238.
239.
240.
241.
В конструкторе производногокласса следует явно
инициализировать только новые
поля, которые не были
унаследованы от базового класса
242.
При помощи спискаинициализаторов мы сообщаем
компилятору какой именно
конструктор следует вызвать
243.
Если необходимо изменитьфункциональность производного
класса относительно базового
класса, то используется
переопределение методов
244.
Если в производном классеимеется метод с таким же
именем и сигнатурой, как и в
базовом классе, такой метод
считается переопределённым
245.
246.
247.
248.
Если в производном классеимеется метод с точно таким же
именем как и в базовом классе, но
различной сигнатурой, то такой
метод называется замещённым
249.
250.
251.
252.
Множественное наследование253.
При множественном наследованиипроизводный класс наследуется от
нескольких базовых классов
254.
Пример множественногонаследования
255.
При множественном наследованиипорядок вызова конструкторов
базовых классов определяется не
списком инициализаторов, а
порядком, в котором указаны
базовые классы при объявлении
производного класса
256.
Порядок вызова конструкторов257.
Деструкторы вызываются впорядке, обратном порядку вызова
конструкторов
258.
Главной проблемоймножественного наследования
являются конфликты имен
259.
Конфликты имен260.
Для решения этой проблемынеобходимо использовать
операцию разрешения контекста
для доступа к полям в
производном классе
261.
Решение проблемы конфликтаимен
262.
«Ромбовидное» наследование263.
Проблема «ромбовидного»наследования состоит в том, что в
производном классе D
дублируется поле из класса A
264.
Для решения проблемынеобходимо класс A сделать
виртуальным базовым классом
и обеспечить его конструктором
по умолчанию
265.
Решение проблемы«ромбовидного» наследования
266.
При создании объекта производногокласса в цепочке вызовов
конструкторов сначала вызываются
конструкторы по умолчанию
виртуальных базовых классов, в
порядке следования слева направо,
а затем все остальные конструкторы
267.
Полиморфизм268.
Механизм раннего связывания269.
270.
Механизм раннего связывания271.
Поскольку тип объектнойпеременной известен на этапе
компиляции программы, то
связывание вызова метода с
самим кодом метода происходит
на этапе построения программы
272.
Такое связывание называетсяранним связыванием
273.
Механизм наследованияпозволяет записывать адрес
объекта производного класса в
указатель на базовый класс
274.
Через указатель на базовыйкласс можно работать с
объектом производного класса,
но только с той частью, которая
была унаследована из базового
275.
Это позволяет абстрагироватьсяот конкретного объекта, от
конкретной реализации
276.
Это дает возможность выбиратьлюбую реализацию во время
выполнения программы
277.
Т.е. работать с любым объектомчерез указатель на базовый класс
278.
279.
При работе с объектомпроизводного класса через
указатель на базовый класс
связывание вызова метода с
самим кодом метода происходит
на этапе построения программы
280.
В результате вызывается методкласса, соответствующий типу
указателя, а не типу объекта,
который адресуется через
данный указатель
281.
Это, по-прежнему, раннеесвязывание
282.
При работе с объектомпроизводного класса через
указатель на базовый класс
желательно, чтобы связывание
вызова метода с самим кодом
метода происходило на этапе
выполнения программы
283.
Необходимо, чтобы вызывалсяметод в соответствии с типом
объекта, а не типом указателя,
который адресует данный объект
284.
Для решения данной проблемыв базовом классе
переопределяемый метод
объявляется как виртуальный
285.
В производных классах этотвиртуальный метод
переопределяется
286.
Класс, который содержит хотябы один виртуальный метод,
называется полиморфным
287.
288.
289.
Для каждого класса иерархии, вкотором определяется или
переопределяется виртуальный
метод, компилятор создаёт
таблицу виртуальных функций
290.
В этой таблице содержатсяадреса всех виртуальных методов
в порядке их описания в классе
291.
Адрес любого виртуальногометода имеет в таблице одно и
то же смещение для каждого
класса в пределах иерархии
292.
Каждый объект полиморфногокласса содержит
дополнительное поле-указатель
vptr на таблицу виртуальных
функций
293.
Этот указатель vptr заполняетсяконструктором при создании
объекта
294.
На этапе компиляциипрограммы все обращения к
виртуальным методам
заменяются на обращения к
таблице через vptr объекта
295.
На этапе выполнения в моментобращения к виртуальному
методу его адрес выбирается из
таблицы и выполняется вызов
296.
В этом и заключается механизмпозднего связывания
297.
Механизм позднегосвязывания
298.
Таким образом, вызоввиртуального метода, в отличие
от обычных методов, выполняется
через дополнительный этап
получения адреса метода из
таблицы виртуальных функций
299.
В производных классахпереопределённые виртуальные
методы не обязательно объявлять
с ключевым словом virtual
300.
Отсюда вытекает правиловиртуальности: метод,
объявленный виртуальным в
некотором классе, остается
виртуальным во всех его потомках
301.
Если в базовом классеимеется виртуальный метод,
то в производном классе
метод с таким же именем и
сигнатурой автоматически
становится виртуальным
302.
Виртуальный метод не можетбыть статическим, однако
может быть другом в
некотором классе
303.
Объект, который адресуетсячерез указатель или ссылку и
имеет хотя бы один виртуальный
метод, называется полиморфным
304.
Виртуальный метод, объявленныйв базовом классе, наследуется
производными классами
305.
Поэтому переопределять егоследует только в том случае,
если необходимо задать
отличающиеся действия
306.
307.
308.
Абстрактный базовый класс309.
Чаще всего базовые классыпредназначены для представления
общих понятий, которые
предполагается конкретизировать
в производных классах
310.
Очевидно, что объекты такихклассов создавать бессмысленно
(например, класс figure)
311.
Базовый класс важенисключительно как абстрактный
класс, определяющий общие
принципы работы его потомков
312.
В языке C++ существуетвозможность зафиксировать эту
абстрактность на уровне самого
языка
313.
Для этого используются чистовиртуальные функции
314.
Чисто виртуальный метод –это метод, который в базовом
классе только объявляется, но
не определяется
virtual void calculateArea ()=0;
315.
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,
содержащий информацию о типе
332.
333.
334.
Операторы == и != позволяютсравнивать два объекта на
равенство и неравенство
335.
Метод name() возвращаетуказатель на строку,
представляющую имя типа,
описываемого объектом класса
type_info
336.
Полиморфное приведение типовс использованием оператора
dynamic_cast
337.
Оператор dynamic_castприменяется для преобразования
указателей родственных классов
иерархии
338.
Чаще всего dynamic_castприменяется для преобразования
указателя базового класса в
указатель на производный
339.
Формат оператора:dynamic_cast <тип *> (выражение)
340.
При этом во время выполненияпрограммы производится
проверка допустимости
преобразования
341.
Для того чтобы проверкадопустимости могла быть
выполнена, аргумент оператора
dynamic_cast должен быть
полиморфного типа, т.е. иметь
хотя бы один виртуальный метод
342.
Если преобразование оказалосьнекорректным, то оно не
выполняется, и оператор вернет
нулевой указатель
343.
344.
345.
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) - это составная
часть стандартной библиотеки
языка С++
374.
STL - это набор шаблонныхклассов и функций общего
назначения, реализующих
наиболее популярные структуры
данных и часто употребительные
алгоритмы работы с ними
375.
Архитектура STL быларазработана Александром
Степановым и Менг Ли
376.
STL состоит из следующихкомпонентов:
контейнеры (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.
Предикаты используются,например, в поисковых
алгоритмах для задания более
сложного критерия поиска