Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Конструкторы и деструкторы.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
78.38 Кб
Скачать

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

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

Конструкторы.

Для многих объектов естественно требовать, чтобы они были инициализированы (то есть получали начальное значение) при их определении.

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

Конструктор – это компонентная функция (метод класса), вызываемая автоматически при создании объекта класса и выполняющая необходимые инициализирующие действия.

Формат определения конструктора в теле класса:

имя_ класса (список_параметров) инциализатор_конструктора

{операторы_тела_конструктора}

Рассмотрим особенности конструкторов.

1) Имя конструктора должно совпадать с именем класса.

2) Конструктор не может возвращать результат, даже тип void не допустим.

3) Конструктор вызывается при определении объекта, или при размещении объекта в памяти с помощью операции new.

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

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

5) Существуют два способа инициализации полей данных создаваемых объектов.

Во – первых, можно в теле конструктора присваивать значения полям данных объектов. Эти значения обычно предоставляют параметры конструктора. Инициализатор, помещенный между списком параметров и телом конструктора, при этом опускается.

Например, в классе Men можно так ввести конструктор:

class Men {

char * name; int age;

public:

Men (char*, int); //прототип конструктора класса

};

Men :: Men (char*n, int a) //внешнее определение конструктора

{name = n; age=a;}

Второй способ предусматривает применение инициализатора ("ctor-initializer").

Инициализатор представляет собой список инициализаторов полей данных объекта, расположенный после списка параметров и отделенный от него ':' (двоеточием).

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

имя_поля_данных (список выражений).

Инициализаторы в списке отделяются друг от друга запятыми.

Для полей данных простых типов в списке выражений используется одно выражение, в которое могут входить константы, параметры конструктора и имена уже инициализированных полей данных.

Рассмотрим пример, где используется конструктор с инициализатором.

сlass A {

Int II; float ee; char cc;

public:

A ( int i, float e, char c ): ii (7), ee ( ii + i * e), cc(c) { }

};

При создании нового объекта с привлечением конструктора с инициализатором последовательность действий такова:

- Выделяется память для объекта.

- Инициализируются не статические поля данных объекта с помощью инициализатора (в списке инициализатора могут присутствовать не все поля).

- Выполняются операторы тела конструктора, причем эти операторы могут изменить, полученные значения полей за счет инициализации, и значения статических полей класса.

6) В определении класса могут присутствовать несколько конструкторов. Конструкторы могут иметь различное число параметров, необходимое для инициализации создаваемого объекта. Параметры могут иметь умалчиваемые значения. При этом допускается только один конструктор с умалчиваемыми значениями или конструктор без параметров.

7) Перечислим названия (виды) конструкторов: конструктор общего вида, конструктор без параметров (единственный, но необязательный), конструктор умолчания, конструктор копирования (единственный).

8) Если в классе программист не определил ни одного конструктора, то по умолчанию формируются конструктор без параметров и конструктор копирования с прототипами соответственно (их автоматически добавляет компилятор):

T::T();

T::T(const T&);

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

9) Параметром конструктора не может быть его собственный объект, но может быть ссылка на него.

10) Нельзя получить адрес конструктора.

11) Конструктор нельзя явно вызывать как обычный метод класса. Конструктор неявно вызывается при создании именованного объекта класса или безымянного, например, в следующих конструкциях:

имя_класса имя_объекта (аргументы конструктора);

имя_класса (аргументы конструктора);

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

имя_класса*имя_указателя = new имя_класса (аргументы конструктора);