Слайд 2Объектно-ориентированное программирование (ООП)
(ООП) — это особый концептуальный подход к
проектированию программ, и C++ расширяет язык С средствами, облегчающими применение
такого подхода.
Наиболее важные характеристики ООП:
абстракция;
инкапсуляция и сокрытие данных;
полиморфизм;
наследование;
повторное использование кода.
Слайд 3Процедурное программирование и ООП
При процедурном подходе вы сначала концентрируетесь
на процедурах, которым должны следовать, а только потом думаете о
том, как представить данные.
При объектно-ориентированном подходе вы концентрируетесь на объекте, как его представляет пользователь, думая о данных, которые нужны для описания объекта, и операциях, описывающих взаимодействие пользователя с данными. После разработки описания интерфейса вы перейдете к выработке решений о том, как реализовать этот интерфейс и как организовать хранение данных. И, наконец, вы соберете все это вместе в программу, соответствующую новому проекту.
Слайд 4Абстракции и классы
Жизнь полна сложностей, и единственный способ справится со
сложностью — это ограничиться упрощенными абстракциями.
В компьютерных вычислениях абстракция —
это ключевой шаг в представлении информации в терминах ее интерфейса с пользователем. То есть вы абстрагируете основные операционные характеристики проблемы и выражаете решение в этих терминах.
Например, тип char занимает 1 байт памяти, a double — обычно 8 байт.
Например, к типу int можно применять все арифметические операции. Целые числа можно складывать, вычитать, умножать, делить.
Слайд 5Спецификация базового типа выполняет три вещи:
Определяет, сколько памяти нужно объекту.
Определяет, как интерпретируются биты памяти.
Определяет, какие операции, или методы,
могут быть применены с использованием этого объекта данных.
Но когда вы определяете пользовательский тип в C++, то должны предоставить эту информацию самостоятельно.
Слайд 6Классы в C++
Класс — это двигатель C++, предназначенный для
трансляции абстракции в пользовательские типы.
Обычно спецификация класса состоит из
двух частей:
Объявление класса, описывающее компоненты данных в терминах членов данных, а также открытый интерфейс в терминах функций-членов, называемых методами.
Определения методов класса, которые описывают, как реализованы определенные функции-члены.
Слайд 7Что такое интерфейс?
Интерфейс — это совместно используемая часть, предназначенная
для взаимодействия двух систем, например, между компьютером и принтером или
между пользователем и компьютерной программой.
Например, чтобы определить количество символов в объекте string, вам не нужно открывать этот объект и смотреть что у него внутри. Вы просто используете метод size () класса, предоставленный его разработчиком. Таким образом, метод size () является частью открытого интерфейса между пользователем и объектом класса string.
Обычно программисты на C++ помещают интерфейс, имеющий форму определения класса, в заголовочный файл, а реализацию в форме кода для методов класса — в файл исходного кода.
Слайд 8Создание класса
Давайте взглянем на класс, представляющий акционерный капитал.
Операции:
приобретение пакета акций
компании;
приобретение дополнительных акций в имеющийся пакет;
продажа пакета;
обновление
объема доли в пакете акций;
отображения информации о пакетах, находящихся во владении.
Сведения для сохранения:
название компании;
количество акций, находящихся во владении;
объем каждой доли;
общий объем всех долей.
Слайд 9Объявление класса под именем Stock
#ifndef применяется для защиты против многократного
включения файла
Соглашение о написании имен классов с заглавной буквы
Экземпляры класса:
Слайд 10Управление доступом
Слова private и public позволяют управлять доступом к
членам класса. Любая программа, которая использует объект определенного класса, может
иметь непосредственный доступ к членам из раздела public. Доступ к членам объекта из раздела private программа может получить только через открытые функции-члены из раздела public.
Открытые функции-члены действуют в качестве посредников между программой и закрытыми членами объекта; они предоставляют интерфейс между объектом и программой. Эта изоляция данных от прямого доступа со стороны программы называется сокрытием данных.
Сокрытие данных предохраняет целостность данных!
Слайд 11Инкапсуляция
Открытый интерфейс представляет абстрактный компонент проектного решения.
Собрание деталей реализации
в одном месте и отделение их от абстракции называется инкапсуляцией.
Сокрытие данных (помещение данных в раздел private класса) является примером инкапсуляции, и поэтому оно скрывает функциональные детали реализации в разделе private.
Слайд 12public или private?
Поскольку одним из главных принципов ООП является сокрытие
данных, то единицы данных обычно размещаются в разделе private.
Использовать ключевое
слово private в объявлении класса не обязательно, поскольку это спецификатор доступа к объектам класса по умолчанию:
Слайд 13Классы и структуры
Описания классов выглядят очень похожими на объявления структур
с дополнениями в виде функций-членов и меток видимости private и
public.
Фактически C++ расширяет на структуры те же самые свойства, которые есть у классов. Единственная разница состоит в том, что типом доступа по умолчанию у структур является public, в то время как у классов — private.
Слайд 14Реализация функций-членов класса
Определения функций-членов очень похожи на определения обычных функций.
При
определении функции-члена для идентификации класса, которому принадлежит функция, используется операция
разрешения контекста (: :).
Методы класса имеют доступ к private-компонентам класса.
Слайд 17Использование классов
Целью языка C++ является сделать применение классов насколько
возможно простым — подобно базовым встроенным типам вроде int и
char.
Создавать объект класса можно за счет объявления переменной этого класса либо использования операция new для размещения в памяти объекта этого класса. Объекты можно передавать в аргументах, возвращать их из функций, присваивать один объект другому.
Создим объект типа Stock по имени f luffy_the_cat.
Слайд 18Клиент-серверная модель
Клиентом является программа, которая использует класс.
Объявление класса, включая
его методы, образует сервер, который является ресурсом, доступным нуждающейся в
нем программе.
Клиент взаимодействует с сервером только через открытый (public) интерфейс. Это означает, что единственной ответственностью клиента и, как следствие — программиста, является знание интерфейса.
Ответственностью сервера и, как следствие — его разработчика, является обеспечение того, чтобы его реализация надежно и точно соответствовала интерфейсу. Любые изменения, вносимые разработчиком сервера в класс, должны касаться деталей реализации, но не интерфейса. Это позволяет программистам разрабатывать клиент и сервер независимо друг от друга, без внесения в сервер таких изменений, которые нежелательным образом отобразятся на поведении клиента.
Слайд 19Конструкторы и деструкторы классов
Для автоматической инициализации объектов при их
создании в C++ предлагаются специальные функции-члены, называемые конструкторами класса, которые
предназначены для создания новых объектов и присваивания значений их членам-данным.
Имя метода конструктора совпадает с именем класса. Например, возможный конструктор для класса Stock — это функция-член Stock ().
Конструкторы не имеют возвращаемого значения, но они не объявляются с типом void. Фактически конструкторы не имеют объявленного типа.
Слайд 20Конструктор для класса Stock
Использование конструкторов
Это тот же код, который использовался
для функции acquire (). Разница в том, что в данном
случае программа автоматически вызовет конструктор при объявлении объекта!
// вызов конструктора явно
// вызов конструктора неявно
// динамическое выделение памяти
Слайд 21Деструкторы
Деструктор призван очищать всяческий «мусор».
Деструктор формируется из имени класса и
предваряющего его символа тильды (~).
Подобно конструктору, деструктор не имеет ни
возвращаемого значения, ни объявляемого типа. Однако в отличие от конструктора, деструктор не должен иметь аргументы.
// прототип деструктора
// реализация деструктора
Слайд 26Указатель this
Создадим функцию, работающую с двумя объектами с целью их
сравнения
// прототип функции
// реализация функции
Массив объектов
Для инициализации элементов массива можно
использовать конструктор. В этом случае необходимо вызывать конструктор для каждого индивидуального элемента:
Слайд 27Вопросы
Что такое класс?
Что такое инкапсуляция?
Каково отношение между объектом и
классом?
Определите класс для представления банковского счета. Данные-члены должны включать
имя вкладчика, номер счета (используйте строку) и баланс. Функции-члены должны позволять следующее:
создание объекта и его инициализация;
отображение имени вкладчика, номера счета и баланса;
добавление на счет суммы денег, переданной в аргументе;
снятие суммы денег, переданной в аргументе.
Приведите объявление класса без реализации методов.
Слайд 28Вопросы
Когда вызываются конструкторы класса? Когда вызываются деструкторы?
Напишите код конструктора
для класса банковского счета, описанного в вопросе 5.
Что такое
конструктор по умолчанию?