Отвечают за создание и уничтожение объектов.
Обзор
Декларация
Конструкторы по умолчанию
Конструкторы копирования
Вызов конструкторов
Обзор
Конструкторы и деструкторы отвечают за создание и уничтожение объектов,
соответственно. В общем, конструкторы дают объектам их начальное состояние,
то есть, они дают определенные значения элементам данных их объектов.
Деструкторы выполняют противоположную функцию; они убеждаются, что все
ресурсы, принадлежащие их объектам освобождаются правильно.
Если по простому, конструкторы - это специальные процедуры, вызываемые при
создании объекта, а деструкторы - это специальные процедуры, которые
вызывается, когда объект уничтожается. Конструкторы и деструкторы вызываются
автоматически компилятором, когда объект создается или уничтожается, будь то
явно с использованием ключевых слов
Dim
или
New или косвенно путем передачи
объекта в процедуру по значению или когда объект выходит из области
видимости.
Декларация
Конструкторы и деструкторы объявляются как процедуры, но с ключевым словом
Constructor
вместо
Sub или
Function
и без имени. Аналогичным образом они определяются с именем
Type
или
Class , в котором они были
продекларированы.
Type или
Class
могут иметь множество конструкторов, но только один деструктор.
Конструкторы по умолчанию
Конструкторы по умолчанию являются конструкторами, которые либо не имеют
параметров, либо все их параметры имеют значения по умолчанию. Они
вызываются, когда объект определен, но не инициализирован, или создается как
часть массива, с ключевыми словами
Dim,
ReDim
или
New[]. Первый конструктор,
объявленный в приведенном ниже примере является конструктором по умолчанию.
Конструкторы копирования
Конструкторы копирования являются конструкторами, которые вызываются, когда
объект создан, или клонирован, из другого объекта того же типа (или объект,
который можно преобразовать к этому типу). Это происходит явно при
инициализации объекта с другим объектом, или неявным образом, путем передачи
объекта в процедуру по значению. Конструкторы копирования объявляются, имея
один параметр: объект того же типа, передаваемый по ссылке.
Конструкторы копирования вызываются только при создании и инициализации
экземпляров объекта. Присваивание объектов обрабатывается с помощью
Пользовательского оператора Let.
Вызов конструкторов
В отличие от других процедур, конструкторы обычно не вызываются напрямую из
экземпляра объекта. Вместо этого конструктор указывается в операторе
Dim
с инициализатором или без него, или в заявлении
New
с аргументами или без.
При указании инициализатора объекта, используется имя типа, за которым
следуют любые аргументы, которые требуются.
Type foo
'' Декларирование конструктора, конструктора
копирования и нормального конструктора
Declare Constructor
Declare Constructor (ByRef As foo)
Declare Constructor (As Integer)
'' Декларирование деструктора
Declare Destructor
ints As Integer Ptr
numints As Integer
End Type
'' Определение конструктора с созданием 100 integers
Constructor foo
ints = New Integer(100)
numints = 100
End Constructor
'' Определение конструктора, который копирует
integers из другого объекта
Constructor foo (ByRef x As foo)
ints = New Integer(x.numints)
numints = x.numints
End Constructor
'' Определение конструктора, который создает некоторый
integer, основанный на параметре
Constructor foo (n As Integer)
ints = New Integer(n)
numints = n
End Constructor
'' Определение деструктора, который уничтожает все
integers
Destructor foo
Delete[] ints
End Destructor
Scope
'' вызовы foo's конструкторов по
умолчанию
Dim a As foo
Dim x As foo Ptr = New foo
'' вызовы foo's конструкторов
копирования
Dim b As foo = a
Dim y As foo Ptr = New foo(*x)
'' вызовы foo's нормальных
конструкторов
Dim c As foo = foo(20)
Dim z As foo Ptr = New foo(20)
'' вызовы foo's деструкторов
Delete x
Delete y
Delete z
End Scope '' <- a, b и c разрушаются
здесь также
Компилятор-обеспечивает
конструкторы и деструкторы
Если отсутствует конструктор копирования, объявленный для
Type
или
Class, компилятор
предоставляет один. Если конструктор не объявлен, компилятор также
предоставляет конструктор по умолчанию.
Компилятор обеспечивает конструкторы по умолчанию с инициализацией
элементов данных по умолчанию, то есть числовые данные и указатели
элементов устанавливаются в ноль (0) для элементов объекта, построенных
по умолчанию. Конструктор копирования, который продекларирован
компилятором объявляет мелкие копии всех членов данных из одного типа в
другой: числовые данные и указатели типов инициализируются с
соответствующими элементами данных в объекте, который копируется, и
элементы объекта копирования строятся из их соответствующих элементов
объекта. Это означает, что динамические ресурсы, например память для
указателей на элементы данных не копируется; только адрес копируется.
Так что если объекту принадлежит ресурс, то он сам отвечает за его
создание и уничтожение. Конструктора копирования, генерируемого
компилятором, не будет достаточно.
Если деструктор не объявлен, компилятор создает один. Этот деструктор
вызывает деструкторы пользовательских объектов и ничего не делает для
числовых данных и указателей. Опять же если объект имеет динамический
ресурс, то данного деструктора не будет достаточно для освобождения всей
памяти, когда объект уничтожается.
Это обычно упоминается как "правило трех»: Если объект нуждается в
конструкторе пользовательского копирования, операторе присваивания или
деструкторе, скорее всего, он нуждается во всех трех.