Слайд 2Стек (Stack)
Стек — это коллекция, элементы которой получают по принципу
«последний вошел, первый вышел» (Last-In-First-Out или LIFO). Это значит, что мы
будем иметь доступ только к последнему добавленному элементу.
В отличие от списков, мы не можем получить доступ к произвольному элементу стека. Мы можем только добавлять или удалять элементы с помощью специальных методов.
Слайд 3Очередь (Queue)
Очереди очень похожи на стеки. Они также не дают
доступа к произвольному элементу, но, в отличие от стека, элементы
кладутся (enqueue) и забираются (dequeue) с разных концов. Такой метод называется «первый вошел, первый вышел» (First-In-First-Out или FIFO). То есть забирать элементы из очереди мы будем в том же порядке, что и клали. Как реальная очередь или конвейер.
Слайд 4Абстрактные типы данных
Программисты часто определяют классы для представления более общих
концепций.
Абстрактный тип данных (abstract data type — ADT). ADT
описывает данные в общей манере, без деталей, связанных с языком или реализацией.
Рассмотрим для примера стек.
Стек содержит множество элементов. Операции:
создание пустого стека;
добавление элемента в вершину стека (т.е. заталкивание (push) элемента);
удаление элемента из вершины стека (т.е. выталкивание (pop) элемента);
проверка, полон ли стек;
проверка, пуст ли стек.
Слайд 5Класс для абстрактного типа данных - стека
typedef указывает, что Item
является unsigned long
Слайд 6Методы класса
Конструктор по умолчанию гарантирует, что все стеки будут создаваться
пустыми.
Слайд 7Тест. Заказы на покупки, которые берутся со стопки на столе,
используя алгоритм LIFO:
Слайд 9Перегрузка операций
Перегрузка операций — это пример полиморфизма C++.
C++
позволяет определять несколько функций с одинаковыми именами и разной сигнатурой
(списками аргументов). Это называлось перегрузкой функций или функциональным полиморфизмом.
Цель такой перегрузки — позволить использовать одно и то же имя функции для некоторой базовой операции, несмотря на то, что она применяется к данным разных типов.
Слайд 10Перегрузка операций
Например, * - выдает значение, когда применяется к
адресу
* - перемножение для двух чисел
Например, operator+ () перегружает операцию
+, a operator* () — операцию *.
Операция должна быть допустимой операцией C++, а не произвольным символом!
Например, объявить функцию operator@ () не получится, т.к. в C++ нет операции @.
Слайд 11Пример перегрузки операции
Класс Time предоставляет методы для Изменения и
сброса времени, для
отображения значений времени и для сложения двух
значений времени.
Слайд 12Аргумент является ссылкой, но возвращаемый тип — нет
Слайд 13Суммирование времени
Вывод программы:
Слайд 14Добавление операции сложения
Методы:
Использование:
Слайд 15Дополнительные перегруженные операции
В заголовочный файл:
Файл реализации:
Использование:
Слайд 16Наследование классов
Одна из главных целей объектно-ориентированного программирования — повторное использование
кода. При разработке нового проекта, особенно крупного, удобнее повторно использовать
уже проверенный код, а не заново изобретать его. Применение старого кода экономит время, а поскольку он уже использован и проверен, в программу не будут внесены новые ошибки. К тому же чем меньше приходится заниматься мелкими деталями, тем удобнее сосредоточиться на общей стратегии программы.
Наследование классов — позволяет порождать новые классы от старых, называемых базовыми классами. Производный класс наследует все свойства, включая методы, старого класса. Унаследовать состояние обычно легче, чем построить его с нуля.
Слайд 17Преимущества наследования
Добавлять новые возможности в существующий класс. Например, в существующий
базовый класс массива можно добавить арифметические операции.
Добавлять данные, которые
представляет класс. Например, взяв за основу базовый класс строки, можно породить класс, в котором добавлен член данных,
представляющий цвет, и который будет использоваться при выводе строки на экран.
Изменять поведение методов класса. Например, от класса Passenger, который представляет услуги, предоставляемые пассажиру авиалинии, можно породить класс First Class Passenger с более высоким уровнем обслуживания.
Слайд 18Базовый класс
Когда один класс наследуется от другого, исходный класс называется
базовым классом, а наследующий — производным классом.
Слайд 20Порождение класса
Данный конкретный заголовок означает, что TableTennisPlayer является
общедоступным базовым
классом — это называется открытым порождением.
Объект производного типа хранит данные-члены
базового типа. (Производный класс наследует реализацию базового класса.)
Объект производного типа может использовать методы базового типа.
(Производный класс наследует интерфейс базового класса.)
Что необходимо добавить к этим унаследованным свойствам?
Производному классу нужны собственные конструкторы.
Производный класс может при необходимости добавлять дополнительные
данные-члены и методы.
Слайд 21Производный класс
Первый конструктор RatedPlayer использует
отдельные формальные параметры для каждого
члена, а второй конструктор — параметр TableTennisPlayer, связывающий три элемента
(firstname, lastname и hasTable)
в единое целое.
Слайд 22Использование базового и производного классов
Слайд 23Полиморфное открытое наследование
Возможны ситуации, когда метод должен обладать разным
поведением в производном и базовом классах. Другими словами, поведение конкретного
метода может отличаться в зависимости от объекта, который его вызывает. Такое более сложное поведение называется полиморфным, поскольку у метода имеется несколько моделей поведения в зависимости от контекста.
Слайд 24Пример
Разработка двух классов. Один класс представляет чековый счет Brass Account,
а второй — чековый счет Brass Plus, в котором добавлено
свойство защиты от овердрафта (превышения кредита).
Слайд 25Использование
поведение при виртуальной функции ViewAcct():
Слайд 26Резюме
Обычно объявление класса разделяется на две части, как правило,
сохраняемые в разных файлах. Объявление класса с методами, представленными с
помощью прототипов функций, попадает в заголовочный файл. Исходный код, составляющий функции-члены, попадает в файл методов. Такой подход позволяет отделить описание интерфейса от деталей реализации.
Класс — это определяемый пользователем тип, а объект — экземпляр класса.
Для того, чтобы использовать класс, необходимо знать только его открытый интерфейс.
Объект является переменной этого типа или эквивалентом переменной.
Если метод нуждается в явном доступе к объекту, который его вызвал, он может сделать это через указатель this.
Бьярне Страуструп: "Упрощайте язык для себя. Не считайте себя обязанными применять все средства языка, и уж тем более не пытайтесь использовать их все в первый же день".
Слайд 27Принципы ООП
1. Абстрагирование
Объект – это программная конструкция, представляющая некоторую сущность.
Каждый объект обладает определенной функциональностью и свойствами. Объект представляет собой
завершенную функциональную единицу, содержащую все данные и предоставляющую всю функциональность, необходимую для решения задачи, для которой он предназначен. Описание объектов реального мира при помощи программных объектов называют абстрагированием (abstraction).
Слайд 28Принципы ООП
2. Инкапсуляция
Смысл инкапсуляции состоит в отделении реализации объекта (его
внутреннего содержания) от способа взаимодействия с ним. Другие объекты приложения
взаимодействуют с рассматриваемым объектом посредством имеющихся у него открытых (public) свойств и методов, которые составляют его интерфейс.
В общем виде под интерфейсом понимается открытый способ взаимодействия между разными системами. Если интерфейс класса не будет меняться, то приложение сохраняет способность к взаимодействию с его объектами, даже если в новой версии класса его реализация значительно изменится.
Слайд 29Принципы ООП
3. Наследование
Наследование есть свойство объектов порождать своих потомков. Объект-потомок
автоматически наследует от родителя все поля и методы, может дополнять
объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.
Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.
Слайд 30Принципы ООП
4. Полиморфизм
Полиморфизм - это свойство родственных объектов (т.е. объектов,
имеющих одного общего родителя) решать схожие по смыслу проблемы разными
способами. В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства.
Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.