1. Введение в классы и объекты: конструкторы, деструкторы и указатель this
Введение в классы и объекты: конструкторы, деструкторы и указатель this
Добро пожаловать в курс «Основы объектно-ориентированного программирования на C++». Это первая статья нашего цикла, и мы начнем с фундамента, на котором строится вся парадигма ООП. До этого момента, вероятно, вы писали программы в процедурном стиле: данные хранились в переменных, а логика — в функциях. Сегодня мы изменим этот подход и научимся объединять данные и поведение в единые сущности.
От процедурного мышления к объектному
В процедурном программировании мы думаем о действиях: «прочитать файл», «вычислить сумму», «вывести результат». В объектно-ориентированном программировании (ООП) мы думаем о сущностях: «Пользователь», «Кнопка», «Банковский счет».
Чтобы понять разницу, представьте завод по производству автомобилей.
!Чертеж — это класс, а реальные машины — это объекты.
Здесь есть два ключевых понятия:
Анатомия класса в C++
В языке C++ класс определяется ключевым словом class. Внутри него мы описываем:
* Поля (атрибуты) — переменные, хранящие состояние объекта. * Методы — функции, описывающие поведение объекта.
Рассмотрим простой пример класса, описывающего точку в двумерном пространстве.
Обратите внимание на спецификатор доступа public:. Он говорит о том, что все, что написано ниже, доступно для использования извне класса. О защите данных (инкапсуляции) мы поговорим в следующих статьях, а пока будем делать наши поля открытыми для простоты.
Чтобы создать объект этого класса (инстанцировать его), мы используем имя класса как тип данных:
Конструкторы: Рождение объекта
В примере выше мы вручную задавали значения x и y. Но что, если мы забудем это сделать? В C++ переменные, не инициализированные явно, могут содержать «мусор» — случайные значения, оставшиеся в памяти.
Чтобы гарантировать, что объект всегда создается в корректном состоянии, используются конструкторы.
Конструктор — это специальный метод, который:
* Имеет то же имя, что и класс.
* Не имеет возвращаемого типа (даже void).
* Вызывается автоматически в момент создания объекта.
Конструктор по умолчанию и с параметрами
Теперь создание объектов выглядит так:
Списки инициализации
В C++ существует профессиональный способ инициализации полей — через список инициализации. Это происходит до входа в тело конструктора и часто является более эффективным.
Синтаксис выглядит так: двоеточие после аргументов, затем перечисление полей и их значений в скобках.
Деструкторы: Завершение жизненного цикла
Если конструктор — это «рождение» объекта, то деструктор — это его «смерть». Деструктор вызывается автоматически, когда объект уничтожается (например, когда программа выходит из функции, где был создан объект).
Особенности деструктора:
* Имя совпадает с именем класса, но перед ним ставится тильда ~.
* Не принимает аргументов и не возвращает значения.
* У класса может быть только один деструктор.
Деструкторы критически важны для освобождения ресурсов (памяти, открытых файлов, сетевых соединений). Даже если вы не выделяли динамическую память, деструктор полезен для понимания времени жизни объекта.
Указатель this: Самоидентификация
Внутри любого метода класса существует скрытый указатель под названием this. Он указывает на текущий объект, для которого был вызван метод.
Представьте, что вы пишете инструкцию для группы людей: «Поднимите правую руку». Каждый человек (объект), выполняющий эту инструкцию, поднимает свою руку. В контексте объекта this — это способ сказать «я» или «мое».
Зачем нужен this?
Чаще всего this используется в двух случаях:
this->.*this), что позволяет вызывать их друг за другом.Итоговый пример
Давайте соберем все знания в одном примере. Создадим класс Book (Книга).
Вывод программы:
Заключение
Сегодня мы сделали первый шаг в мир ООП. Мы узнали, что класс — это чертеж, а объект — это реализация этого чертежа. Мы научились управлять рождением объекта с помощью конструкторов и его уничтожением с помощью деструкторов, а также поняли, как объект может ссылаться на самого себя через указатель this.
В следующей статье мы углубимся в тему инкапсуляции и узнаем, почему делать все поля public — плохая идея, и как модификаторы доступа private и protected помогают писать надежный код.