Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

3.3. Конструкторы и деструкторы.

Одна из главных целей С++ заключается в том, чтобы сделать использование объектов таким же простым, как и использование встроенных типов данных (int, float и т.д). Переменные простых типов можно инициализировать при создании. Хотелось бы иметь такую же возможность и при создании объектов (экземпляров класса). С этой целью используются специальные методы класса − конструкторы.

Конструктор – метод класса, вызываемый автоматически при создании объекта, который выполняет функцию инициализации полей начальными значениями и, возможно, некоторые другие действия (выделение памяти, открытие файлов и т.д.) Имя конструктора должно совпадать с именем класса, данный метод не возвращает значения (при этом слово void не пишется). Часто в классе объявляется несколько конструкторов с различными параметрами. Типичный случай − три конструктора: конструктор по умолчанию (без параметров), конструктор с параметрами и конструктор копирования, который в качестве параметра принимает объект такого же класса и создаёт его копию.

В предыдущих примерах мы обошлись вообще без написания конструкторов. Это не очень хорошо, поскольку при создании локального объекта его поля (имеющие простые типы), не инициализируются и содержат случайные значения. Можете провести небольшие эксперименты с программным кодом примера 1.1 – добавьте глобальные объекты типа complex_t и убедитесь с помощью метода show(), что локальные и глобальные объекты инициализируются по-разному.

Отметим, что если в классе не определено конструкторов, один из них (конструктор копирования) компилятор добавляет автоматически.

В качестве примера напишем три конструктора для структуры "комплексное число". В данном случае действие конструктора копирования будет совпадать с тем, что вставляет компилятор, но мы приводим этот пример в учебных целях.

Конструктор по умолчанию (конструктор без параметров). При реализации конструкторов можно использовать различный синтаксис для инициализации полей класса. Во-первых, можно присваивать значения полям в теле конструктора:

complex_t() {

re = 0; im = 0;

}

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

Более правильный синтаксис заключается в использовании списка инициализации, как показано в примере:

complex_t() : re(0), im(0) {}

При этом тело конструктора получилось пустым.

Конструктор с параметрами:

complex_t(double _re, double _im) : re(_re), im(_im) {}

Допускается называть параметры конструктора так же, как поля класса, в этом случае конструктор будет выглядеть так:

complex_t(double re, double im) : re(re), im(im) {}

Встречая в списке инициализации запись re(re), компилятор понимает, что нужно инициализировать поле re параметром re.

Конструктор копирования (в данном классе не обязателен):

complex_t(const complex_t &other) : re(other.re), im(other.im) {}

Деструктор – это метод, автоматически вызываемый при удалении объекта. Деструкторы имеют такое же имя, как и имя класса, только перед именем ставится знак ~ (тильда). Деструкторы играют важную роль, если класс работает с динамической памятью (использует операторы new и delete).

Деструктор для класса complex_t не требуется, но мы создадим пустой деструктор, чтобы продемонстрировать, как он объявляется:

~complex_t(){}

Конструктор нельзя вызывать как метод класса, используя объект, т.к. объект уже создан и проинициализирован. Деструктор вручную вызвать можно, но обычно делать этого не стоит, т.к. при правильном программировании деструкторы вызываются автоматически.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]