Имя_поля_данных(список_выражений)

Инициализаторы полей данных отделяются в списке друг от друга запятыми. Для полей данных базовых типов в списке выражений используется одно выражение, в которое могут входить константы, параметры конструктора и имена уже инициализированных полей данных.

При создании нового объекта с привлечением конструктора с инициализатором последовательность действий такова:

  1. Выделяется память для объекта.
  2. Инициализируются не статические поля данных объекта с помощью инициализатора конструктора. (В списке инициализаторов могут присутствовать не все поля данных класса.)
  3. Используются операторы тела конструктора, причем эти операторы могут изменить значения полей данных, полученные за счет инициализации, и значения статических полей класса.

Для конструктора не определяется тип возвращаемого значения. С помощью параметров конструктору могут быть переданы любые данные, необходимые для создания и инициализации объектов класса.

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

Конструктор (и не один) существует для любого класса, причем он может быть создан без явных указаний программиста. Если в классе программист не определил ни одного конструктора, то по умолчанию формируются автоматически (их добавляет компилятор) конструктор без параметров и конструктор копирования с прототипами соответственно:

T::T();

T::T(const T&);

где T – имя класса. Эти конструкторы по умолчанию создаются как открытые (public).

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

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

 

имя_класса имя_объекта;

имя_класса имя_массива_объектов[размер];

указатель_на_объекты_класса=new имя_класса;

указатель_на_объекты_класса=new имя_класса[размер];

 

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

 

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

Форматы определений:

имя_класса имя_объекта(аргументы_конструктора);

указатель_на_объекты_класса=

new имя_класса(аргументы_конструктора);

 

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

Этот конструктор вызывается в тех случаях, когда новый объект создается путем копирования существующего:

  • при описании нового объекта с инициализацией другим объектом;
  • при передаче объекта в функцию по значению;
  • при возврате объекта из функции, а также при обработке исключений.

 

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

В отличие от конструкторов по умолчанию и конструкторов копирования, конструкторы преобразования системой не подставляются.

 

Обобщим сказанное относительно конструкторов:

  • В классе может быть несколько конструкторов (перегрузка), но только один с умалчиваемыми значениями параметров либо с пустым списком параметров.
  • Конструктор не возвращает никакого значения.
  • Нельзя получить адрес конструктора.
  • Параметром конструктора не может быть его собственный объект, но может быть ссылка на него, как у конструктора копирования.
  • Конструктор нельзя вызывать как обычный метод класса. Для явного вызова конструктора можно использовать две разные синтаксические формы:

имя_класса имя_объекта(аргументы_конструктора);

имя_класса(аргументы_конструктора);

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

Вторая форма явного вызова конструктора приводит к созданию объекта, не имеющего имени. Созданный таким вызовом безымянный объект может использоваться в тех выражениях, где допустимо использование объекта данного класса.

 

Деструкторы

Для выполнения действий, которые сопровождают удаление объекта в каждом классе явно или неявно определяется специальный метод, называемый деструктором. Имя деструктора – это имя класса, перед которым помещен символ «тильда» (~).

Форма определения деструктора:

 

~имя_класса()

{ операторы_деструктора}

У деструктора нет возвращаемого значения и отсутствуют параметры. Если в классе явно не определен деструктор, то компилятор встроит его определение в класс автоматически. Статус доступа у такого деструктора public.

Назначение деструктора – выполнение всех действий, сопровождающих удаление объекта. Наиболее важное – освобождение всех ресурсов, включенных в объект при его создании или выполнении действий над объектом. Такими ресурсами могут быть: участки памяти, динамически выделенной для полей объекта, файлы, открытые при создании объекта и связанные с ним, и.т.п. Однако деструкторы могут быть нужны и при уничтожении объектов, не «захвативших» никаких ресурсов. Например, перед удалением каждого объекта требуется сохранить в каком-то виде сведения об его свойствах, и это делать в программе нужно многократно и во многих местах. В этом случае удобно иметь средство, которое выполнит эту работу автоматически. Таким средством может служить специально подготовленный деструктор.

Деструктор может вызываться явно, как и другие методы класса.

Форматы вызова деструктора:

имя_объекта.~имя_класса();

имя_указателя_на_объект_класса->~имя_класса();

 

Деструктор вызывается без вмешательства программиста (автоматически, неявно), когда программа «покидает» блок, в котором объект класса определен как объект автоматической памяти. Кроме того, деструктор неявно вызывается в тех случаях, когда объект, размещенный в динамической памяти, удаляется с помощью операции delete.

 


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



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