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

Конструктор і деструктор класу в C ++
3.7 (73.33%) 6 голосів




конструктор класу c ++, деструктор класу 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;
  • Конструктор и деструктор не имеют типа возвращаемого значения;
  • Имена класса, конструктора і деструктора повинні збігатися;
  • Конструктор может принимать параметры. Деструктор не принимает параметры;
  • При визначенні деструкції перед ім'ям треба додати символ ~ ;
  • Конструкторов может быть несколько, но их сигнатура должна отличаться (кількістю прийнятих параметрів, например);
  • Деструкція в класі повинен бути визначений тільки один.

Щоб підтримати наш сайт – натисніть на скарбничку і виберіть будь-який зручний спосіб.

Нові уроки з програмування:

PureCodeCpp – Основы программирования на C для начинающих

6 думки про "Конструктор і деструктор класу в C ++

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

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

  2. >> Один об'єкт оголошується відразу під час визначення класу - рядок 25. При запуску програми конструктор цього об'єкту спрацює навіть до входу в головну функцію.

    Зовсім не важливо відразу “під час визначення” або потім. Викликається він раніше, тому що це глобальний об'єкт.

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

    Якщо об'єкт виділяє всередині себе пам'ять – то так, треба писати руками деструктор і звільняти її.
    Але у вашому випадку динамічна пам'ять не виділяється, а деструкція таки потрібен (він коректно повинен знищити об'єкт). Але в вашому прикладі його можна було і не писати зовсім – якщо деструктора в класі немає – то буде створено деструктор за замовчуванням – він видалить коректно об'єкт, але пам'ять, розподілену динамічно природно не звільнить.

    Однак є в С ++ розумні покажчики і якщо використовувати їх – то майже завжди можна покладатися на деструкцію за замовчуванням )).

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

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

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

      Конечно, ще будуть статті. Конструктор копіювання – обов'язково в окремій статті розглянемо. Про конструкторах за замовчуванням – додам до цієї статті.

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>