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

Конструктор предназначен для инициализации объекта и вызывается автоматически при его создании. Ниже перечислены основные свойства конструкторов.

  • Конструктор не возвращает значения, даже типа void. Нельзя получить указатель на конструктор.
  • Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).
  • Конструктор, который можно вызвать без параметров, называется конструктором по умолчанию.
  • Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.
  • Если программист не указал ни одного конструктора, компилятор создает его автоматически (кроме случая, когда класс содержит константы и ссылки, поскольку их необходимо инициализировать). Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы базовых классов.
  • Конструкторы не наследуются.
  • Конструктор не может быть константным, статическим и виртуальным (нельзя использовать модификаторы const, virtual и static).
  • Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).

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

Конструкторы часто вызываются неявно для создания временных объектов. Обычно это происходит в следующих случаях:

  • при инициализации;
  • при выполнении операции присваивания;
  • для задания значений параметров по умолчанию;
  • при создании и инициализации массива;
  • при создании динамических объектов;
  • при передаче параметров в функцию и возврате результатов по значению.

Примеры:

monster Super(200, 300), Vasia(50);monster X = monster(1000);

В последнем операторе создается объект Х, которому присваивается безымянный объект со значением параметра health = 1000 (значения остальных параметров устанавливаются по умолчанию).

При создании динамического массива вызывается конструктор без аргументов.

В качестве примера класса с несколькими конструкторами усовершенствуем описанный ранее класс monster, добавив в него поля, задающие цвет (skin) и имя (name):

enum color {red, green, blue}; // Возможные значения цветаclass monster{int health, ammo;color skin;char *name;public: monster(int he = 100, int am = 10); monster(color sk); monster(char * nam);...};//--------------------------------monster::monster(int he, int am) { health = he; ammo = am; skin = red; name = 0;}//--------------------------------monster::monster(color sk) { switch (sk) { case red: health = 100; ammo = 10; skin = red; name = 0; break; case green: health = 100;ammo = 20;skin = green;name = 0;break; case blue: health = 100; ammo = 40; skin = blue;name = 0;break; }}//--------------------------------monster::monster(char * nam){/* К длине строки добавляется 1 для хранения нуль-символа */name = new char [strlen(nam) + 1]; strcpy(name, nam);health = 100; ammo = 10; skin = red;}//--------------------------------monster * m = new monster ("Ork");monster Green (green);

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

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

monster::monster(int he, int am): health (he), ammo (am), skin (red), name (0){}

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: