Вы находитесь на странице: 1из 30

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ

ПРОГРАММИРОВАНИЕ В С++
• ВВЕДЕНИЕ В ООП
• ПОНЯТИЯ КЛАССА И ОБЪЕКТА
• ОСНОВНЫЕ ПРИНЦИПЫ ООП
• СПЕЦИФИКАТОРЫ ДОСТУПА
• ВЫНОС ТЕЛА МЕТОДА ЗА КЛАСС
• ПОНЯТИЕ АКСЕССОРА, ИНСПЕКТОРА, МОДИФИКАТОРА
ПОНЯТИЕ ООП
Ранее мы с вами уже знакомились с концепцией функционального программирования, при котором
основная логика задачи (алгоритм) представляется в виде набора функций. И каждая из таких
функций реализует отдельные шаги общего алгоритма.
Пока мы реализуем простые задачи и нам достаточно имеющихся (встроенных) типов данных, то
функционального подхода достаточно.
Однако в проектах для предметных областей со сложной структурой, в которой нужно обязательно
учитывать особенности взаимодействия (связи) между ее объектами, нам нужна другая методология.
Нужен такой подход, который позволит описать связь между данными и функциями их обработки
(что невозможно в функциональном программировании).
Например, функция_1 должна работать только с данными одного типа, функция_2 только с
другими.
И более того, нам нужно создать такую функцию_3, которая с данными первого типа работает по
одному алгоритму, а для данных второго типа предоставляет совсем другую функциональность.
ПОНЯТИЕ ООП
Рассмотрим эту ситуацию на примере.
Предположим, что у нам необходимо оценить уровень успеваемости по критериям “отлично”,
“хорошо”, “удовлетворительно”, “неудовлетворительно” для ученика и студента.
При этом у студента оценка варьируются в диапазоне от 0 до 100, а у ученика от 1 до 12, т.е.
диапазоны критериев успеваемости абсолютно не совпадают. Для студента “отлично” - это балл от
90 до 100, а для ученика - от 10 до 12.
Более этого студенческие баллы со значениями выше 12 вообще являются ошибочными данными
для студента.
При использовании функционального подхода нам нужно, как минимум, создавать две отдельные
функции с разными именами.
А что, если потом в задаче добавится еще и ученик младших классов, у которого оценки от 1 до 5?
Тогда придется создать еще одну, третью, функцию.
ПОНЯТИЕ ООП
Рассмотрим эту ситуацию на примере.
А как вообще проверить, чьи это баллы? Студента или ученика?
По имени «Jane» или «Bob» это точно не определить.
А это нужно знать, чтобы определить, какую функцию вызвать в программе: defineStudSuccess() или
definePupSuccess()?
То есть нам необходима связь “объект - его данные -его функциональность”, которую
функциональное программирование простым и прозрачным способом обеспечить не может.
Однако функциональное программирование не является единственным подходом к разработке
программного обеспечения. Не менее популярной и даже более распространенной является
парадигма объектно-ориентированного программирования (ООП).
Объектно-ориентированное программирование (ООП) — это такой подход к разработке программ
(парадигма программирования), при котором отдельные компоненты системы (программы)
представляются в виде объектов.
ПОНЯТИЕ ООП
Популярность ООП также вызвана тем фактом, что использование объектно-ориентированного
программирования позволяет практически однозначно отобразить сущности (элементы) реального
мира (предметной области, задачи) в структуру программы.
При этом сохраняются особенности их структуры, связи (зависимости) между ними и детали их
поведения.
Можно сказать, что ООП помогает нам разрабатывать программу с таким содержимым, которое
наиболее похоже на наше естественное представление о задаче (фрагменте реального мира).
Конечно, основными концепциями в ООП являются понятия объекта и класса.
Большинство сущностей (компонентов, частей) любой предметной области — это объекты.
Например, клиент банка, у которого есть имя, фамилия, возраст, еще какие-то характеристики,
является объектом реального мира.
Клиент банка может открыть счет, проверить состояние счета, пополнить счет и т.д., т.е. у него есть
поведение (отображающее те задачи, который он должен решать в этой предметной области).
ПОНЯТИЯ КЛАССА И ОБЪЕКТА
Класс — это некоторый шаблон (макет), описывающий структуру и возможное поведение объекта.
Можно сказать, что класс — это чертеж (схема), используя которую можно создать конкретный
объект.
Конкретная реализация (воплощение) такого шаблона — это объект (называемый также
экземпляром класса). Один объект может отличаться от другого также, как один клиент банка
отличается от другого: фамилией, возрастом и т.д.
Рассмотрим на примере животного - кошки. У каждой кошки есть голова, лапы, хвост, уши, шерсть, т.
е. описывая какую-то отдельную породу кошки нам необходимо описывать эти характеристики.
Также каждая кошка умеет мяукать, прыгать, сидеть. Таким образом, кошка — это класс с
перечисленными свойствами и указанным поведением.
А вот сиамская кошка, у которой голова напоминает треугольник, сужающийся прямыми линиями к
утонченной морде, уши — крупные и заостренные, это объект (т. е. экземпляр класса кошка).
Таким образом, класс — это пользовательский тип данных, описывающий то, какими свойствами и
поведением будут обладать переменные этого типа. А объект — это переменная класса, т.е.
экземпляр с конкретным значением этих свойств.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. ИНКАПСУЛЯЦИЯ
Объектно-ориентированное программирование строится на трех основополагающих принципах:
инкапсуляция, полиморфизм и наследование.
Инкапсуляция — одна из фундаментальных концепций объектно-ориентированного
программирования, которая позволяет скрывать детали внутренней реализации объектов.
Можно сказать, что согласно этому принципу, класс должен рассматриваться, как некий черный
ящик.
Пользователь не знает, что находится внутри (особенности реализации), и взаимодействует с ним
только с помощью предоставленного интерфейса.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. ИНКАПСУЛЯЦИЯ
Рассмотрим на примере.
Для того, чтобы водить современный автомобиль с автоматической коробкой передач не нужно
знать, как устроен и работает его двигатель, что такое бензонасос, где расположена система
охлаждения двигателя. Все эти особенности и действия отдельных механизмов автомобиля скрыты
от водителя и, в тоже время, разрешают ему крутить руль и нажимать на педали газа или тормоза,
не задумываясь, что в это время происходит под капотом.
Такое сокрытие внутреннего устройства и процессов, реализующих работу автомобиля, гарантируют
простоту его использования и эффективность управления. Даже для водителей, которые не имеют
значительного опыта вождения и не являются профессиональными автомеханиками.

Таким образом, инкапсуляция обеспечивает безопасность внутреннего содержимого класса.


Ведь когда мы таким способом скрываем от пользователя внутреннее устройство объекта, мы
обеспечиваем его надежную работу.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. НАСЛЕДОВАНИЕ
Наследование — это возможность использовать данные и функциональность чего-то уже
существующего для создания нового (на этой имеющейся основе).
В контексте ООП наследование - это способность одного класса получать (наследовать) свойства и
поведение другого класса.
Наследование является основным механизмом повторного использования кода в ОО-парадигме.
Производный (дочерний) класс — это класс, которые который наследует свойства другого класса,
расширяя его функциональность и/или характеристики.
Базовый (родительский) класс — это класс, свойства и поведение которого наследуются.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. ПОЛИМОРФИЗМ
• В буквальном смысле термин полиморфизм буквально обозначает наличие нескольких форм
одного и того же. В ОО парадигме полиморфизм предоставляет возможность использовать
один и тот же интерфейс функции (с разными особенностями поведения) для разных
объектов.
• Рассмотрим понятие полифоризма на примере кнопки- включения / выключения для
стиральной машины, пульта кондиционера и электрочайника. На всех перечисленных
устройствах кнопка выглядит (реализована) по-разному (хотя изображение на ней для
стиральной машины и пульта кондиционера может быть похожим).
ОСНОВНЫЕ ПРИНЦИПЫ ООП. ПОЛИМОРФИЗМ
• В буквальном смысле термин полиморфизм буквально обозначает наличие нескольких форм
одного и того же.
• В ОО парадигме полиморфизм предоставляет возможность использовать один и тот же
интерфейс функции (с разными особенностями поведения) для разных объектов.
• Рассмотрим понятие полифоризма на примере кнопки- включения / выключения для стиральной
машины, пульта кондиционера и электрочайника.
• На всех перечисленных устройствах кнопка выглядит (реализована) по-разному (хотя
изображение на ней для стиральной машины и пульта кондиционера может быть похожим).
• При этом результат ее нажатия один и тот же - прибор включается и начинает работать согласно
своей программы функционирования.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. ПОЛИМОРФИЗМ
• В ОО-программировании полиморфизм реализуется с помощью механизма перегрузки метода
класса.
• Мы уже знакомы с перегрузкой функций, которая позволяет создавать несколько функций с
одинаковыми именами, но разным набором параметров и разной логикой поведения.
• При этом интерпретатор сам определяет, какой код будет работать, в зависимости от количества
или типа аргументов при вызове функции.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Одной из наиболее полезных особенностей языка C++ является возможность определять
собственные типы данных, которые будут лучше соответствовать в решении конкретных проблем.
Вы уже видели, как перечисления и структуры могут использоваться для создания собственных
пользовательских типов данных.
• Например, структура для хранения даты:

• Перечисления и структуры — это традиционный (не объектно-ориентированный) мир


программирования, в котором мы можем только хранить данные.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Для вывода даты на экран (что может понадобиться выполнить и не раз, и не два) хорошей
идеей будет написать отдельную функцию, например:
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• В объектно-ориентированном программировании типы
данных могут содержать не только данные, но и функции,
которые будут работать с этими данными.
• Для определения такого типа данных в языке C++
используется ключевое слово class.
• Использование ключевого слова class определяет новый
пользовательский тип данных — класс.
• В языке C++ классы очень похожи на структуры, за
исключением того, что они обеспечивают гораздо большую
мощность и гибкость. Фактически, следующая структура и
класс идентичны по функционалу:
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Так же, как и объявление структуры, объявление класса не приводит к выделению какой-либо
памяти.
• Для использования класса нужно объявить переменную этого типа класса:

• В языке C++ переменная класса называется экземпляром (или «объектом») класса.


• Точно так же, как определение переменной фундаментального типа данных (например, int x)
приводит к выделению памяти для этой переменной, так же и создание объекта класса
(например, DateClass today) приводит к выделению памяти для этого объекта.
• Точно так же, как к полям структуры, так и к компонентам (переменным и функциям) класса
доступ осуществляется через оператор выбора (.):
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Помимо хранения данных, классы могут содержать и функции! Функции, определенные внутри
класса, называются методами.
• Методы могут быть определены, как внутри, так и вне класса.
• Пока что мы будем определять их внутри класса (для простоты), как определить их вне класса —
рассмотрим несколько позже.
• Класс Date с методом вывода даты:
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Обратите внимание, как эта программа похожа на вышеприведенную программу, где
используется структура.
• Однако есть несколько отличий.
• В версии DateStruct нам нужно было передать переменную структуры непосредственно в
функцию print() в качестве параметра. Если бы мы этого не сделали, то функция print() не знала
бы, какую переменную структуры DateStruct выводить. Нам тогда бы пришлось явно ссылаться на
члены структуры внутри функции.
• Методы класса работают несколько иначе: все вызовы методов должны быть связаны с объектом
класса. Когда мы вызываем today.print(), то мы сообщаем компилятору вызвать метод print()
объекта today
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• На что фактически ссылаются m_day, m_month и m_year? Они ссылаются на связанный объект
today (который определен caller-ом).
• Поэтому, при вызове today.print(), компилятор интерпретирует:
➢ m_day, как today.m_day;
➢ m_month, как today.m_month;
➢ m_year, как today.m_year.
• Если бы мы вызвали tomorrow.print(), то m_day ссылался бы на tomorrow.m_day.
• По сути, связанный объект неявно передается методу. По этой причине его часто называют
неявным объектом.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Рекомендуемые правила при создании классов:
• Использование префикса m_ (англ. «m» = «members») для переменных-членов класса помогает
различать переменные-члены класса от параметров функции или локальных переменных внутри
методов класса. Это полезно по нескольким причинам:
➢ во-первых, когда мы видим переменную с префиксом m_, то мы понимаем, что работаем с
переменной-членом класса;
➢ во-вторых, в отличие от параметров функции или локальных переменных, объявленных
внутри функции, переменные-члены объявляются в определении класса. Следовательно, если мы
хотим знать, как объявлена ​переменная с префиксом m_, мы понимаем, что искать нужно в
определении класса, а не внутри функции.
• Пишите имена классов с заглавной буквы.
ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Определим простейший класс Person. В данном случае класс называется Person и представляет
человека.

Но данный класс мало что делает. Теперь изменим его:


ОСНОВНЫЕ ПРИНЦИПЫ ООП. КЛАССЫ
• Теперь класс Person имеет две переменных name
и age, которые предназначены для хранения
имени и возраста человека соответственно.
• Также класс определяет функцию move, которая
выводит строку на консоль.
• Также стоит обратить внимание на модификатор
доступа public:, который указывает, что идущие
после него переменные и функции будут
доступны извне, из внешнего кода.
• Затем в функции main создается один объект
класса Person.
А с помощью выражения
• Можно передать значение переменной name.
Получить это значение в какую-нибудь переменную.
Ну и также мы можем вызывать функции у объекта:
ОСНОВНЫЕ ПРИНЦИПЫ ООП. МЕТОДЫ КЛАССА
• Определение функции-члена класса синтаксически ничем не отличается от определения обычной
функции С++: заголовок функции, тело функции, тип возвращаемого значения, параметры…
• Но есть одно важное отличие: в коде функции-члена
класса можно обращаться не только к локальным
переменным и параметрам функции, но и к
переменным-членам класса.
ВЫНОС ТЕЛА МЕТОДА ЗА КЛАСС
• Для этого, как и в случае с функцией, должна быть
возможность реализации класса в отдельном файле.
• И так же, как с функцией, нужен отдельный
заголовочный файл, включающий в себя необходимую
для компиляции информацию о классе.
• Что должно входить в этот заголовочный файл? — то,
что должен проверить компилятор: имена полей
класса и прототипы методов класса.
• Перенесем код класса в отдельный файл за два шага.
На первом шаге вынесем код функции-члена класса
getAver из описания класса и поместим его отдельно в
том же файле
ВЫНОС ТЕЛА МЕТОДА ЗА КЛАСС
• Определение класса Student (с прототипом getAver)
расположено перед функцией main, тогда реализацию
функции можно поместить как перед, так и после
main.
• Разместим код функции getAver после кода main:

• Обратите внимание, что перед именем функции-члена


класса getAver в заголовке функции записано имя
класса Student и операция разрешения области • На втором шаге поместим в нашем
действия «::» (двойное двоеточие). Таким образом проекте класс Student в отдельном
функция-член класса getAver «присоединяется» файле исходного кода. Сначала
к отделенному от нее определению класса Student. удалим (или закомментируем) код
• Без этого префикса «Student::» перед именем функция класса Student. Если этого не
была бы распознана компилятором просто как сделать, то нельзя будет добавить
обычная функция, не имеющая никакого отношения к проекту еще один класс с таким
к классу же именем Student.
Создать метод для вывода полной информации о студенте
Класс – в модуле!!!!

Вам также может понравиться