Экземпляры класса создаются в стековой памяти с помощью специальной компонентной функции класса – конструктора.
Конструктор представляет собой специальную функцию-элемент, которая имеет имя, идентичное имени класса, объявляется без типа возвращаемого значения (ничего не возвращает в точку вызова и поэтому не имеет оператора return) и этим формально отличается от обычных функций. Если конструктор не определен в классе, то компилятор генерирует конструктор по умолчанию без параметров. Конструктор вызывается всегда, когда создается новый объект.
В теле конструктора могут быть любые операторы, в том числе и вызовы функций. Конструктор не наследуется, не может быть объявлен с атрибутами const, volatile или static и не может быть объявлен как виртуальный.
Конструктор с параметрами позволяет инициализировать объект путем присваивания элементам-данным начальных значений.
Явно определенный в классе конструктор может быть с параметрами и без параметров. Определение конструктора имеет вид:
имя_класса( список_параметров ) { тело }
имя_класса() { тело }.
В первом случае значениями параметров в теле конструктора инициализируются элементы-данные класса. Во втором случае инициализация осуществляется значениями, заданными в теле конструктора. Если конструктор генерируется по умолчанию, то инициализация осуществляется нулевыми значениями.
При явном определении конструктора элементы-данные могут инициализироваться двумя способами:
- индивидуальным присвоением значений компонентным данным в теле конструктора;
- использованием списка инициализации данных в заголовке конструктора
Пример:
а) class Time
{ inthr, min;
public: Time (int h) {hr = h; min = 0;} // первый способ
Time (int h, int m): hr(h), min(m){} // второй способ
};
voidmain(){
Time start1(17);
Time start(17,45);
}
б) classTime { // комбинация двух способов
int min; const int hr;
public:
Time (int h, int m): hr(h) {min = m;}
};
Список инициализации является единственным средством присвоения значений элементам-данным класса, объявленным как const или как ссылки.
Для вызова конструктора используется следующие синтаксические формы:
имя_класса имя_объекта;
имя_класса имя_объекта(аргументы);
имя_класса(аргументы);
Первая форма используется для вызова стандартного конструктора (по умолчанию). Вторая форма используется для конструктора с параметрами. Третья форма используется для создания и инициализации объекта без имени, когда необходимо инициализировать вновь создаваемый объект значениями другого объекта (без имени) с помощью операции присваивания или когда имя объекта не используется в последующем контексте программы. Именно такая форма используется при создании объекта в динамической памяти.