Объектно-ориентированное программирование

Объектно-ориентированное программирование (ООП) — это способ организации программы, позволяющий использовать один и тот же код многократно. В отличие от использования функций, ООП позволяет не только разделить программу на фрагменты, но и описать предметы реального мира в виде объектов, а также организовать связи между этими объектами.

ООП

Основным «кирпичиком» ООП является класс. Класс включает набор переменных (называемых полями или свойствами класса) и функций для управления этими переменными (называемых методами). В совокупности поля и методы называются членами класса. После создания класса его название становится новым типом данных. Тем самым пользовательские классы расширяют возможности языка C++.

На основе класса можно создать множество объектов (экземпляров класса). При этом для каждого объекта создается свой набор локальных переменных. Например, при изучении строк мы рассматривали класс string. При объявлении переменной название класса указывалось вместо типа данных:

std::string str1("String1"), str2("String2");

В этом примере созданы два объекта str1 и str2, которые являются экземплярами класса string. Каждый объект хранит информацию о своей строке, указанной при инициализации. Изменение одного объекта не затрагивает значение другого объекта. Внутри каждого объекта, незаметно для нас, производятся операции по выделению, увеличению и освобождению объема памяти, необходимого для хранения строки. Тем самым при создании объекта или его изменении нам не нужно указывать конкретный объем памяти и следить за освобождением памяти.

Чтобы иметь возможность манипулировать строкой, класс string предоставляет множество методов. Например, с помощью метода size() мы получали количество символов в строке. При вызове метода его название указывается после названия объекта через точку:

std::cout << str1.size() << std::endl;

Помимо методов, класс string перегружает некоторые операторы. Например, для конкатенации используется оператор +:

str1 = str1 + str2;

Перегрузка операторов производится с помощью методов, имеющих специальные названия. Определив в классе «операторный» метод можно изменить поведение оператора по своему вкусу. Например, перегрузив оператор + можно вместо сложения производить вычитание. Однако пользователи класса вряд ли положительно оценят такую инициативу. Тем не менее в некоторых случаях изменение смысла оператора довольно полезно. Например, класс cout перегружает оператор побитового сдвига << для вывода данных в окно консоли.

Проводя аналогию с реальным миром, можно сказать, что телевизор является экземпляром класса (объектом), а проект, по которому создавался телевизор, представляет собой класс. По этому проекту можно создать множество телевизоров (множество экземпляров класса). Кнопки и разъемы на корпусе телевизора, да и сам корпус, являются отдельными объектами соответствующего класса. Сам процесс нажатия кнопки, приводящий к включению или выключению телевизора, переключению канала и т. д., выполняется с помощью методов. Для сохранения текущего состояния кнопки, а также размеров кнопки, ее цвета и др. предназначены поля. Одна и та же кнопка может выполнять разные действия. Например, одиночное нажатие кнопки выполняет одно действие, а удержание кнопки (перегрузка метода) в течении пяти секунд приводит к выполнению совершенно другого действия.

Все содержимое телевизора находится внутри корпуса и скрыто от глаз. Чтобы пользоваться телевизором, абсолютно не нужно знать как он устроен внутри, достаточно иметь кнопки (интерфейс доступа) и руководство пользователя (документация к классу). Точно так же разработчик класса может предоставить интерфейс доступа, а остальную часть кода защитить от изменения (сокрытие данных в ООП называется инкапсуляцией). В дальнейшем разработчик класса имеет возможность изменить внутреннюю реализацию класса, при этом не изменяя интерфейс доступа.

В один прекрасный момент разработчик телевизора решает выпустить новую модель, просто добавив внутрь корпуса DVD-плеер. При этом большинство блоков внутри телевизора останутся от предыдущей модели, а основные изменения коснутся корпуса. Таким образом, телевизор с DVD-плеером наследует конструкцию предыдущей модели, добавляет новую функциональность (DVD-плеер) и переопределяет некоторые методы.

В результате наследования в производном классе может измениться поведение какого-либо метода. Например, автобус и гусеничный трактор являются наследниками класса «транспортное средство», в котором определен метод, описывающий способ движения. Совершенно очевидно, что движение автобуса отличается от движения гусеничного трактора. Поэтому класс «автобус» может наследовать метод от класса «транспортное средство» не переопределяя его, а класс «гусеничный трактор» должен переопределить метод. Во всех этих классах теперь имеется доступ к одноименному методу, но реализации его различаются. Тем не менее, этот метод выполняет одно и то же действие — движение транспортного средства. В ООП такое явление называется полиморфизмом.

Итак, мы познакомились с тремя основными понятиями ООП:

  • инкапсуляция — сокрытие данных внутри класса;
  • наследование — возможность создания производных классов на основе базового класса. При этом производный класс автоматически получает возможности базового класса и может добавить новую функциональность или переопределить некоторые методы;
  • полиморфизм — смысл действия, которое выполняет одноименный метод, зависит от объекта, над которым это действие выполняется.

Что же должно быть представлено в виде классов, а что в виде методов или полей? Если слово является существительным (автомобиль, телевизор, кнопка и т. д.), то оно может быть описано как класс. Метод описывает действие, применяемое к объекту, — например: начать движение, нажать кнопку, изменить цвет и т. д. Поле предназначено для сохранения текущего состояния объекта и его характеристик —например, размера кнопки и ее цвета, признака, нажата она или нет.

В заключение этого краткого обзора следует заметить, что именно поддержка ООП отличает язык C++ от языка C, который поддерживает только процедурный стиль программирования. В отличии от языков C# и Java, ООП-стиль программирования в языке C++ не является обязательным стилем. В своих программах вы можете использовать только процедурный стиль. И в процедурном и в ООП-стиле есть свои преимущества и недостатки. Какой стиль использовать зависит от конкретной ситуации. Но чем больше будет ваша программа, тем более очевидными будут преимущества ООП-стиля.

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов