Разница между конструктором и деструктором

Автор: Laura McKinney
Дата создания: 1 Апрель 2021
Дата обновления: 14 Май 2024
Anonim
Уроки C++ с нуля / Урок #19 - Конструкторы и деструкторы
Видео: Уроки C++ с нуля / Урок #19 - Конструкторы и деструкторы

Содержание


Конструктор и деструктор являются функциями-членами с тем же именем, что и их класс. Бывший тип конструктор помогает в инициализации объекта. И наоборот, деструктор отличается от конструктора, который удаляет созданный конструктор, когда он бесполезен.

Иногда требуется инициализировать некоторую часть объекта, прежде чем его можно будет использовать. Например, мы работаем со стеком, прежде чем выполнять какое-либо действие, вершина стека всегда должна быть установлена ​​на ноль. Эта функция автоматической инициализации выполняется через «Конструктор». Например, если объект должен выполнить некоторый код, прежде чем он будет уничтожен. Например, если объект должен закрыть файл, который он открыл, перед его уничтожением. Это может быть выполнено с помощью «Destructor».

Давайте рассмотрим некоторые фундаментальные различия между конструктором и деструктором с помощью сравнительной таблицы

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Заключение

Сравнительная таблица:

Основа для сравненияКонструкторDestructor
Цель

Он выделяет память для объекта.Это освобождает память об объекте.
декларация имя_класса (если есть аргументы) {};~ имя_класса (без аргументов) {};
аргументы Конструктор принимает аргумент Деструктор не принимает никаких аргументов.
призваниеКонструктор вызывается автоматически при создании объекта.Деструктор вызывается автоматически при выходе из блока или завершении программы.
РаботаетКонструктор позволяет объекту инициализировать часть своего значения до того, как он будет использован.Деструктор позволяет объекту выполнять некоторый код во время его уничтожения.
Порядок исполнения

Конструктор вызывается в последовательном порядке.
Деструктор вызывается в обратном порядке конструктора.
В цифрах В классе может быть несколько конструкторов.В классе всегда есть один деструктор.
Копировать конструктор Конструктор копирования позволяет конструктору объявлять и инициализировать объект из другого объекта.Нет такой концепции.
Над загрузкой Конструкторы могут быть перегружены.Деструктор не может быть перегружен.


Определение конструктора:

конструктор в основном является функцией-членом класса, которая инициализирует объект и выделяет ему память. Конструкторы могут быть легко идентифицированы, поскольку они объявлены и определены с тем же именем, что и у класса. Конструктор не имеет никакого возвращаемого типа; так что они ничего не возвращают, даже "пусто". Конструктор всегда определяется в открытом разделе класса.

В классе может быть несколько конструкторов; их можно различить по количеству и типу передаваемых аргументов. Если в классе несколько конструкторов; неявный конструктор (конструктор бездействия) должен быть определен вместе с ними; это ничего не делает, но, удовлетворяет компилятор.

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


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

Существует в основном три типа конструкторов: конструкторы по умолчанию, параметризация и конструкторы копирования.

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

Реализация конструктора:

класс Const {int a, b; public: Const () // конструктор без параметра {a = 0; б = 0; } Const (int c, int d) {// конструктор с параметром a = c; с = д; }}; int main () {Const C1; С2 (10,20); // этот оператор вызывает конструктор}

При создании C1 выполняется конструктор без параметров, поскольку C1 не передает никаких параметров. Принимая во внимание, что, когда C2 создан, конструктор с параметром выполняется, поскольку он передает два целых числа конструктору.

Определение деструктора:

Destructor также является функцией-членом класса, который освобождает память, выделенную для объекта. Он определяется с тем же именем, что и у класса, которому предшествует тильда (~) условное обозначение. Деструкторы всегда вызываются в обратном порядке конструкторов.

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

Реализация деструктора:

класс Const {int a, b; public: Const (int c, int d) // конструктор с параметром. {а = с; с = д; cout << "значения a и b равны" <<>

Когда создается объект C1, вызывается конструктор с двумя параметрами целочисленного типа, инициализируется член «a, b» и редактируется значение «a, b». После этого деструктор вызывается и «объект C1 уничтожается».

Нужен деструктор

Создание конструктора занимает некоторое пространство памяти, поскольку в конечном итоге он выделяет память для объектов. Эта выделенная память должна быть освобождена до уничтожения объектов, чтобы освободить ресурсы для других задач. Деструкторы чрезвычайно полезны для предназначенной цели, которая эффективно разрушает объекты и выполняет задачи очистки для освобождения памяти.

  1. Основная цель конструктора - выделить память объектам при их создании. В отличие от этого, основная цель деструктора состоит в том, чтобы освободить память объекта, когда он разрушен.
  2. Конструктор может принимать аргументы, так как аргументы могут быть использованы для инициализации членов данных класса. С другой стороны, деструктор не принимает никаких аргументов, поскольку его единственной работой является освобождение памяти объекта.
  3. Конструктор вызывается при создании объекта. Напротив, деструктор вызывается, когда программа завершается или программа выходит из кадра, в котором создан объект.
  4. Конструктор обычно используется для инициализации членов данных класса, тогда как деструктор используется, чтобы позволить объекту выполнить какое-то действие до его уничтожения.
  5. Конструкторы выполняются в последовательном порядке, что означает, что если есть производный класс, который наследует базовый класс, и объект производного класса создается, то он сначала вызовет конструктор базового класса, а затем конструктор производного класса. И наоборот, сначала вызывается деструктор производного класса, а затем базовый класс, это означает, что деструктор выполняется в обратном порядке конструктора.
  6. В классе может быть несколько конструкторов, которые идентифицируются переданными числовыми аргументами, тогда как в нем может быть только один деструктор.
  7. Существует концепция конструктора копирования, которая позволяет объекту инициализироваться из другого объекта, в то время как деструктор не имеет такой концепции.
  8. Конструкторы могут быть перегружены для выполнения различных действий под именем одного и того же конструктора. Напротив, деструкторы не могут быть перегружены.

Заключение:

Помимо сходства, этот конструктор и деструктор являются специальной функцией-членом класса и имеют одно и то же имя, существенное различие между ними заключается в том, что «конструктор» вызывается во время выделения памяти, а «деструктор» вызывается в время освобождения памяти объектов. И конструктор, и деструктор неявно вызываются компилятором, даже если они не определены в классе.