Основы программирования на С++ для начинающих

Конструктор и деструктор класса в C++

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

Конструктор (от construct – создавать) – это особый метод класса, который выполняется автоматически в момент создания объекта класса. То есть, если мы пропишем в нем, какими значениями надо инициализировать поля во время объявления объекта класса, он сработает без “особого приглашения”. Его не надо специально вызывать, как обычный метод класса.

Пример:

В строках 11 – 17 определяем конструктор: имя должно быть идентично имени класса;  конструктор НЕ имеет типа возвращаемого значения (void в том числе). Один объект объявляется сразу во время определения класса – строка 25. При запуске программы, конструктор этого объекта сработает даже до входа в главную функцию. Это видно на следующем снимке:

конструктор класса c++, деструктор класса c++, конструктор и деструктор класса с++

программа еще не дошла до выполнения строки 29 setlocale(LC_ALL, "rus");  , а конструктор уже “отчитался”, что сработал (кириллица отобразилась некорректно). В строке 30 – смотрим, что содержат поля класса. Второй раз конструктор сработает в строке 32, во время создания объекта obj2.

Деструктор (от destruct – разрушать) – так же особый метод класса, который срабатывает во время уничтожения объектов класса. Чаще всего его роль заключается в том, чтобы освободить динамическую память, которую выделял конструктор для объекта. Имя его, как и у конструктора, должно соответствовать имени класса. Только перед именем надо добавить символ ~

Добавим деструктор в предыдущий код. И создадим в классе два конструктора: один будет принимать параметры, второй – нет.

Деструктор определен в строках 34 – 37. Для простоты примера он просто отобразит строку в том месте программы, где сработает. Строка 43 – объявляем объект класса и передаем данные для записи в поля. Тут сработает конструктор с параметрами. А в строке 46 – сработает конструктор по умолчанию.

конструктор класса c++, деструктор класса c++, конструктор и деструктор класса с++

Видим, что деструктор сработал автоматически и дважды (так как в программе было два объекта класса). Он срабатывает тогда, когда работа программы завершается и уничтожаются все данные.

Важное:

    • Конструктор и деструктор должны быть  public;
    • Конструктор и деструктор не имеют типа возвращаемого значения;
    • Имена класса, конструктора и деструктора должны совпадать;
    • Конструктор может принимать параметры. Деструктор не принимает параметры;
    • При определении деструктора перед именем надо добавить символ   ~  ;
  • Конструкторов может быть несколько, но их сигнатура должна отличаться (количеством принимаемых параметров, например);
  • Деструктор в классе должен быть определен только один.

11 thoughts on “Конструктор и деструктор класса в C++

  1. Я так понял я с автором живу в разных часовых поясах, а то у меня еще 09.11.14
    Забавно :)

    1. Да – у нас тут в стране восходящего солнца 10-е наступило на 2 дня раньше )) А завтра так вообще 31-е декабря будет!

  2. >> Один объект объявляется сразу во время определения класса – строка 25. При запуске программы конструктор этого объекта сработает даже до входа в главную функцию.

    Совсем не важно сразу “во время определения” или потом. Вызывается он раньше, потому что это глобальный объект.

  3. >> Чаще всего его роль заключается в том, чтобы освободить динамическую память, которую выделял конструктор для объекта.

    Если объект выделяет внутри себя память – то да, надо писать руками деструктор и освобождать ее.
    Но в вашем случае динамическая память не выделяется, а деструктор таки нужен (он корректно должен уничтожить объект). Но в вашем примере его можно было и не писать вовсе – если деструктора в классе нет – то будет создан деструктор по умолчанию – он удалит корректно объект, но память, распределенную динамически естественно не освободит.

    Однако есть в С++ умные указатели и если использовать их – то почти всегда можно полагаться на деструктор по умолчанию )).

    Не затронута куча вопросов по теме статьи, например:
    – список инициализации конструктора;
    – виртуальный деструктор;
    – конструктор копирования;
    – конструкторы по умолчанию;
    – исключения в конструкторах и деструкторах;
    – т .п.

    Оно все будет описано? )

    1. этот милый смайлик в конце комментария…

      Конечно, еще будут статьи. Конструктор копирования – обязательно в отдельной статье рассмотрим. О конструкторах по умолчанию – добавлю в эту статью.

  4. setlocale(LC_ALL, “rus”);
    что-то в примере с конструктором кодировка русская работает, а в примере с деструктором – нет. =:(

    1. Конструктор (от construct – создавать) – это особый метод класса, который выполняется автоматически в момент создания объекта класса.

  5. Он сработал при автоматическом удалении локальных переменных внутри блока main.

  6. Bыплaтa пepeчиcлeнa нa вaш cчёт ->>> https://forms.yandex.ru/cloud/6547f889068ff0ecfdb5873a/?hs=980e6c175393ec78bffd9f4762f80dba& # MN267:

    uv1akb

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *