Введение

Специальная функция, вызываемая для создания объекта.

В объектно-ориентированном программировании, основанном на классах, конструктор (сокращение: ctor) — это специальный тип функции, вызываемой для создания объекта. Он подготавливает новый объект к использованию, часто принимая аргументы, которые конструктор использует для установки необходимых переменных-членов. Конструктор похож на метод экземпляра, но отличается от него отсутствием явного типа возвращаемого значения, неявным наследованием и обычно другими правилами для модификаторов доступа. Конструкторы часто имеют то же имя, что и объявляющий класс. Их задача — инициализировать члены данных объекта и установить инвариант класса, завершаясь с ошибкой, если инвариант не выполняется. Правильно написанный конструктор оставляет полученный объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе. Большинство языков допускают перегрузку конструкторов, то есть для класса может быть определено несколько конструкторов с разными параметрами. Некоторые языки учитывают специальные типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возвращают новый экземпляр этого класса, абстрагируются с помощью фабрик, которые также создают объекты, но могут делать это различными способами, используя несколько классов или различные схемы выделения памяти, такие как пул объектов.

Конструкторы копирования

Как и C++, Java также поддерживает "Copy Constructor". Но, в отличие от C++, Java не создает конструктор копирования по умолчанию, если вы не определите собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. Конструктор копирования имеет один формальный параметр, который является типом этого класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Даже если оба класса одинаковы, он рассматривается как конструктор преобразования. Хотя конструкторы копирования обычно сокращенно называют copy ctor или cctor, они не имеют отношения к конструкторам классов, используемым в .NET с той же аббревиатурой.

Конструкторы для преобразования

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

Конструкторы перемещения

В C++ конструкторы перемещения принимают rvalue-ссылку на объект класса и используются для реализации передачи владения ресурсами параметризованного объекта.

Синтаксис

Java, C++, C#, ActionScript, PHP 4 и MATLAB используют соглашение о наименовании, при котором конструкторы имеют то же имя, что и класс, к которому они принадлежат. В PHP 5 рекомендуемым именем для конструктора является `construct`. Для обеспечения обратной совместимости, метод с тем же именем, что и класс, будет вызван, если метод `construct` не найден. Начиная с PHP 5.3.3, это работает только для классов без пространств имен. В PHP 7 конструктор всегда следует называть `construct`. Методы с тем же именем, что и класс, вызовут ошибку уровня E_DEPRECATED. В Perl конструкторы, по соглашению, называются "new" и выполняют значительную часть работы по созданию объектов. В объектной системе Moose для Perl конструкторы (называемые new) создаются автоматически и расширяются путем определения метода BUILD. В Visual Basic .NET конструктор называется "New". В Python конструктор разделен на два метода: "new" и "init". Метод "new" отвечает за выделение памяти для экземпляра и принимает класс в качестве аргумента (обычно называемого "cls"). Метод "init" (часто называемый "инициализатором") принимает вновь созданный экземпляр в качестве аргумента (обычно называемого "self"). Конструкторы в Object Pascal обозначаются ключевым словом "constructor" и могут иметь пользовательские имена (но чаще всего называются "Create"). В Objective-C метод конструктора разделен на два метода: "alloc" и "init", где метод "alloc" выделяет память для экземпляра класса, а метод "init" выполняет основную часть инициализации экземпляра. Вызов метода "new" вызывает как метод "alloc", так и метод "init" для экземпляра класса.

Организация памяти

В Java, C# и VB NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой "кучей". Типы значений (такие как int, double и т.д.) создаются в последовательной структуре, называемой "стек". VB NET и C# также позволяют использовать оператор `new` для создания объектов типа "значение", но эти объекты типа "значение" создаются в стеке независимо от того, используется оператор или нет. В C++ объекты создаются в стеке при вызове конструктора без оператора `new`, и в куче при вызове конструктора с оператором `new`. Объекты, созданные в стеке, удаляются автоматически при выходе из области видимости, в то время как объекты, созданные в куче, должны быть удалены либо деструктором, либо явно с помощью оператора `delete`.