Конструктор предназначен для инициализации объекта и вызывается автоматически при его создании. Ниже перечислены основные свойства конструкторов.
- Конструктор не возвращает значения, даже типа void. Нельзя получить указатель на конструктор.
- Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).
- Конструктор, который можно вызвать без параметров, называется конструктором по умолчанию.
- Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.
- Если программист не указал ни одного конструктора, компилятор создает его автоматически (кроме случая, когда класс содержит константы и ссылки, поскольку их необходимо инициализировать). Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы базовых классов.
- Конструкторы не наследуются.
- Конструктор не может быть константным, статическим и виртуальным (нельзя использовать модификаторы const, virtual и static).
- Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).
При объявлении объектов вызывается один из конструкторов. При отсутствии инициализирующего выражения в объявлении объекта вызывается конструктор по умолчанию, при инициализации другим объектом того же типа - конструктор копирования (см. далее), при инициализации полей - один из явно определенных конструкторов инициализации (т.е. конструкторов, которым передаются параметры для инициализации полей объекта).
|
|
Конструкторы часто вызываются неявно для создания временных объектов. Обычно это происходит в следующих случаях:
- при инициализации;
- при выполнении операции присваивания;
- для задания значений параметров по умолчанию;
- при создании и инициализации массива;
- при создании динамических объектов;
- при передаче параметров в функцию и возврате результатов по значению.
Примеры:
monster Super(200, 300), Vasia(50);monster X = monster(1000);В последнем операторе создается объект Х, которому присваивается безымянный объект со значением параметра health = 1000 (значения остальных параметров устанавливаются по умолчанию).
При создании динамического массива вызывается конструктор без аргументов.
В качестве примера класса с несколькими конструкторами усовершенствуем описанный ранее класс monster, добавив в него поля, задающие цвет (skin) и имя (name):
|
|
Первый из приведенных выше конструкторов является конструктором по умолчанию, поскольку его можно вызвать без параметров. Объекты класса monster теперь можно инициализировать различными способами, требуемый конструктор будет вызван в соответствии со списком инициализации. При задании нескольких конструкторов следует соблюдать те же правила, что и при написании перегруженных функций - у компилятора должна быть возможность распознать нужный вариант.
Существует еще один способ инициализации полей в конструкторе (кроме уже описанного присваивания полям значений параметров) - с помощью списка инициализаторов, расположенным после двоеточия между заголовком и телом конструктора:
monster::monster(int he, int am): health (he), ammo (am), skin (red), name (0){}Поля перечисляются через запятую. Для каждого поля в скобках указывается инициализирующее значение, которое может быть выражением. Без этого способа не обойтись при инициализации полей-констант, полей-ссылок и полей-объектов. В последнем случае будет вызван конструктор, соответствующий указанным в скобках параметрам.