Для чего нужен деструктор

Конструкторы и деструкторы

Конструкторы

Конструктор — функция, предназначенная для инициализации объектов класса. Рассмотрим класс date :

Если конструктор требует аргументы, их следует указать:

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

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

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

Конструктор по умолчанию

При создании объекта вызывается конструктор, за исключением случая, когда объект создается как копия другого объекта этого же класса, например:

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

Во всех этих случаях транслятор не вызывает конструктора для вновь создаваемого объекта:

Вместо этого в них копируется содержимое объекта-источника:

Конструктор копии

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

Деструкторы

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

. Так, для класса X деструктор будет иметь имя

Поля, имеющие тип класса

Конструкторы членов класса всегда выполняются до конструктора класса, в котором эти члены описаны. Порядок выполнения конструкторов для членов класса определяется порядком объявления членов класса. Если конструктору члена класса требуются аргументы, этот член с нужными аргументами указывается в списке инициализации. Деструкторы вызываются в обратном порядке.

Источник

Конструктор и деструктор класса в C++

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

Конструктор (от construct – создавать) – это особый метод класса, который выполняется автоматически в момент создания объекта класса. То есть, если мы пропишем в нем, какими значениями надо инициализировать поля во время объявления объекта класса, он сработает без “особого приглашения”. Его не надо специально вызывать, как обычный метод класса.

В строках 11 – 17 определяем конструктор: имя должно быть идентично имени класса; конструктор НЕ имеет типа возвращаемого значения (void в том числе). Один объект объявляется сразу во время определения класса – строка 25. При запуске программы, конструктор этого объекта сработает даже до входа в главную функцию. Это видно на следующем снимке:

Для чего нужен деструктор. Смотреть фото Для чего нужен деструктор. Смотреть картинку Для чего нужен деструктор. Картинка про Для чего нужен деструктор. Фото Для чего нужен деструктор

Деструктор (от destruct – разрушать) – так же особый метод класса, который срабатывает во время уничтожения объектов класса. Чаще всего его роль заключается в том, чтобы освободить динамическую память, которую выделял конструктор для объекта. Имя его, как и у конструктора, должно соответствовать имени класса. Только перед именем надо добавить символ

Добавим деструктор в предыдущий код. И создадим в классе два конструктора: один будет принимать параметры, второй – нет.

Источник

Деструктор (программирование)

Деструктор (программирование)

Дестру́ктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).

Содержание

Деструктор в Delphi

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

Деструктор в С++

Виртуальный деструктор

Практически всегда деструктор делается виртуальным. Делается это для того, чтобы корректно (без утечек памяти) уничтожались объекты не только заданного класса, а и любого производного от него. Например: в игре уровни, звуки и спрайты могут создаваться загрузчиком, а уничтожаться — менеджером памяти, для которого нет разницы между уровнем и спрайтом.

Пусть (на C++) есть тип Father и порождённый от него тип Son :

Нижеприведённый код является некорректным и приводит к утечке памяти.

Однако, если сделать деструктор Son виртуальным:

Деструктор в UML

См. также

Полезное

Смотреть что такое «Деструктор (программирование)» в других словарях:

Деструктор класса — Деструктор специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Содержание 1 Деструктор в Delphi 2 Деструктор в С++ 3 Виртуальный деструктор … Википедия

Деструктор — У этого термина существуют и другие значения, см. Деструкторы (экология). Деструктор специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Содержание 1 Деструктор в Delphi 2 Деструктор в С++ … Википедия

Конструктор (программирование) — У этого термина существуют и другие значения, см. Конструктор. В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) специальный блок инструкций, вызываемый при создании объекта.… … Википедия

Объектно-ориентированное программирование на Python — Объектно ориентированное программирование на Python программирование на Python с использованием парадигмы ООП: с самого начала Python проектировался как объектно ориентированный язык программирования[1]. Содержание 1 Введение 1.1 … Википедия

Объектно-ориентированное программирование на Питоне — С самого начала Питон проектировался как объектно ориентированный язык программирования [1]. Содержание 1 Введение 1.1 Принципы ООП … Википедия

Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия

Класс (объектно-ориентированное программирование) — Класс, наряду с понятием «объект», является важным понятием объектно ориентированного подхода в программировании (хотя существуют и бесклассовые объектно ориентированные языки, например, Прототипное программирование). Под классом подразумевается… … Википедия

Правило трёх (C++ программирование) — Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка») правило в C++, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода[1]: Деструктор… … Википедия

Правило трех (C++ программирование) — Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка») правило в C++, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода[1]: Деструктор… … Википедия

Блок (программирование) — У этого термина существуют и другие значения, см. Блок. Блок кода, блок команд, блок инструкций часть кода, которая сгруппирована и воспринимается как единое целое (похоже на параграф). Блоки могут состоять из одного или нескольких… … Википедия

Источник

Простое введение в C++. Часть 2. Конструкторы и деструкторы

В этой статье мы рассмотрим, для чего в C++ нужны конструкторы и деструкторы.

Проблема с инициализацией

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

Например, в языке С мы можем создать переменную и тут же задать ей значение:

Эта строка прямого действия — как она написана, так она и выполняется.

В C++ так сделать нельзя, потому что объявление класса — это просто описание свойств класса, а выполнение возможно только в экземпляре класса.

То есть программисту на C++ нужно все время помнить, на каком уровне что работает:

Например, наследование работает на уровне объявления класса, а присваивание значений — на уровне экземпляра класса.

Как же задать значение переменной? Первое, что приходит в голову — это создать экземпляр класса и затем задать значение свойству класса. То есть написать так.

Казалось бы, проблема решена и у нас получилось задать значение переменной. Но не все так просто. При создании экземпляров класса мы можем создавать их сколько угодно. Поэтому, если мы напишем.

мы создадим 10 экземпляров класса и нам придется писать инициализацию для всех десяти переменных. Это при том, что у нас одна переменная, а если у нас их десяток, то присвоение начального значения становятся весьма трудоемким занятием.

Для решения этой проблемы в C++ добавлен такой инструмент как конструктор класса.

Конструктор класса

Конструктор — это функция, которая имеет то же имя, что и класс и вызывается каждый раз при создании класса. Если вы не определили ни одного конструктора, компилятор создаст конструктор по умолчанию, не имеющий параметров.

Конструктор работает на уровне экземпляра класса и предназначен для присвоения значений переменных. Конструктор не имеет типа возвращаемого значения.

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

Динамические объекты в C++

Следующей важной особенностью C++ является работа с динамической памятью. В языке С работа с динамической памятью очень проста и использует всего две функции:

В C++ все намного сложнее. Для работы с динамической памятью вводится понятие динамический объект.

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

Для создания нового объекта используется ключевое слово new.

В этой строке создан новый динамический объект — целое число. Возможно создать объекта любого типа данных: int, float, double, char и т. д. Создадим динамический экземпляр класса:

В этой строке мы создали динамический экземпляр класса. Только в этом случае мы должны ссылаться на свойства и методы через знак «->».

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

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

Создание динамических объектов происходит в конструкторе класса. А где же проиходит их удаление? Для этого в классе есть специальная функция — деструктор.

Деструктор класса

Деструктор — это функция, которая имеет то же имя, что и класс, но со знаком «

» (тильда) в начале. В деструкторе нужно уничтожить все динамические объекты, которые были созданы в конструкторе.

При объявлении деструкторов действуют несколько правил. Деструкторы:

Теперь напишем пример, в котором используются все функции, которые мы узнали:

В этом примере мы создали:

Только надо указать компилятору, что используется C++ 11, раньше нельзя было задать элементы массива при создании динамического массива.

Проблема утечки памяти

Работа с динамическими объектами в C++ породило проблему утечки памяти.

В языке Си в силу простоты вызова обычно программисты используют схему:

Ошибиться, конечно, можно и здесь, но в целом схема простая и ошибку найти не сложно.

Как только запускается программа на C++, то на основе объявлений классов начинают создаваться или уничтожаться разнообразные объекты. При этом если объект был использован, но память не освободил, то при каждом создании этого объекта программа начинает забирать все больше памяти. Постепенно программа забирает всю оперативную память и операционная систем начинает запускать процесс свопинга — подключения дисковой памяти, что вызывает резкое торможение всей системы.

С точки зрения пользователя — это выглядит так. Сначала программа работала быстро, а потом начинает замедляться и замедляться. И помогает только закрытие программы и открытие ее снова.

Проблема утечки памяти — это одна из самых распространенных ошибок в языке C++. Как выразился автор книги «Думай как программист» Антон Спрол: «Управление временем существования переменной — это бич каждого программиста С++».

Поэтому работа с динамическими объектами в C++ требует особой внимательности.

Источник

BestProg

Деструкторы. Определение деструктора. Общедоступные и приватные деструкторы. Примеры использования деструкторов. Отличия между конструкторами и деструкторами

Содержание

Поиск на других ресурсах:

1. Какое назначение деструктора в классе?

Деструктор – это обратная по отношению к конструктору функция.

Имя деструктора совпадает с именем класса, перед которым следует символ ‘

2. Пример использования общедоступного деструктора

Общий код модуля, в котором объявляется структура и класс.

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

Да, можно. Такой деструктор называется приватным деструктором.

4. В каких случаях целесообразно объявлять приватные деструкторы?

Использование приватных деструкторов целесообразно в тех случаях, когда обычным пользователям запрещается освобождать память для прежде созданных объектов (уничтожать раньше созданные объекты).

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

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

Это связано с тем, что такие объекты в дальнейшем невозможно будет уничтожить.

Например. Пусть задан класс, в котором объявлен приватный деструктор.

Если попробовать создать объект класса в другом программном коде

то компилятор выдаст ошибку

6. Может ли деструктор иметь параметры?

Деструктор не может иметь параметров.

7. Какие основные отличия между использованием конструкторов и деструкторов в классах?

При использовании в классе, между конструктором и деструктором можно определить следующие основные отличия:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *