Конструкторы
Конструктор предназначен для инициализации объекта. Он вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Ниже перечислены свойства конструкторов:
-
Конструктор не возвращает значения, даже типа void
-
Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (перегрузка конструкторов)
-
Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов – значение null.
-
Кoнструктор, вызываемый без параметров, называется конструктором по умолчанию.
-
Конструктор, имеющий параметры, называется конструктором инициализации.
Если при создании объектов требуется присваивать полю разные значения, это следует делать в конструкторе. В примере в класс Demo добавлен конструктор, а поля сделаны закрытыми (ненужные в данный момент элементы опущены). В программе создаются 2 объекта с различными значениями полей.
Кoнструктор по умолчанию
Кoнструктор, не требующий параметров, называется конструктором по умолчанию. Это может быть конструктор с пустым списком параметров или конструктор, в котором все аргументы имеют значения по умолчанию.
Конструкторы могут быть перегруженными, но конструктор по умолчанию может быть только один.
Однако имеются случаи, в которых создание объекта без вызова конструктора осуществляется неявно:
- формальный параметр – объект, передаваемый по значению, создается в стеке в момент вызова функции и инициализируется копией фактического параметра;
- результат функции – объект, передаваемый по значению, в момент выполнения оператора return копируется во временный объект, сохраняющий результат функции.
Во всех этих случаях транслятор не вызывает конструктора для вновь создаваемого объекта:
- date2 в приведенном определении;
- для создаваемого в стеке формального параметра;
- для временного объекта, сохраняющего значение, возвращаемое функцией.
Вместо этого в них копируется содержимое объекта-источника:
- date1 в приведенном примере;
- фактического параметра;
- объекта-результата в операторе return.
Кoнструктор копии
Как правило, при создании нового объекта на базе уже существующего происходит поверхностное копирование, то есть копируются те данные, которые содержит объект-источник. При этом если в объекте-источнике имеются указатели на динамические переменные и массивы, или ссылки, то создание копии объекта требует обязательного дублирования этих объектов во вновь создаваемом объекте. С этой целью вводится конструктор копии, который автоматически вызывается во всех перечисленных случаях. Он имеет единственный параметр — ссылку на объект-источник:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class String { char *str; int size; public: String(String&); // Конструктор копирования }; String::String(String& right) { // Создает копии динамических // переменных и ресурсов str = new char[right->size]; strcpy(str, right->str); size = right->size; } |