Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы объектов

Когда вызываются конструкторы и деструкторы

Деструкторы

Можно определить специальную функцию-член, называемую деструктором и автоматически вызываемую всякий раз при уничтожении объекта. Имя деструктора совпадает с именем класса и содержит дополнительный символ префикса «~». По аналогии с конструктором деструктор определяется без задания типа возвращаемого значения (нельзя указать даже void). Однако в отличие от конструктора ему нельзя передавать параметры. Например, если класс называется CMessage, его деструктор определяется следующим образом.

~CMessage(){// код деструктора... }

Деструктор может выполнять любые задачи, необходимые для удаления объекта. Например, конструктор класса (CMessage) выделяет блок памяти для хранения строки сообщения, а деструктор освобождает память непосредственно перед удалением экземпляра класса.

#include <string.h> class CMessage{ private:char *Buffer; // хранит строку сообщения public:CMessage () { Buffer = new char ('\0'); // инициализирует буфер // пустой строкой } ~CMessage () // деструктор класса{

delete [] Buffer; // освобождает память

}void Display (){// код для отображения содержимого переменной Buffer... } void Set (char *String) // запись новой строки сообщения{delete [] Buffer;Buffer = new char [strlen (String) + 1];strcpy (Buffer, String); } };

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

• Объект определен глобально (т. е. вне любой функции). Конструктор вызывается в самом начале программы до вызова функции main (или WinMain в программе, работающей в среде Windows), деструктор – по окончании программы.

• Объект определен локально (т.е. внутри функции). Конструктор вызывается, когда поток управления достигает определения объекта, деструктор – при выходе за пределы блока, в котором определен объект (т.е. когда объект выходит из области видимости).

• Объект определен локально с использованием спецификатора static. Конструктор вызывается, когда поток управления впервые достигает определения объекта, деструктор – в конце программы;

• Объект создан динамически с использованием оператора new. Конструктор вызывается при создании объекта, а деструктор – когда объект явно уничтожается с использованием оператора delete. Если этого не происходит, деструктор не будет вызван никогда.

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

CRectangle RectTable [10];

CRectangle – это класс, рассмотренный в предыдущей главе. Массив объектов также можно создать динамически.

CRectangle *RectTable = new CRectangle [10];

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

Если вы определили именованный массив объектов (как в первом примере), то каждый элемент массива можно инициализировать, передавая в конструктор требуемые значения. Этот прием описан в параграфе «Инициализация массивов» (гл. 5).

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

delete [] RectTable;

Если символы «[]» отсутствуют, то компилятор вызовет деструктор только для первого элемента массива.

Примечание

Конструкторы для элементов массива вызываются в порядке возрастания адресов, а деструкторы – в обратном порядке.

<== предыдущая лекция | следующая лекция ==>
Константные объекты и функции-члены | Организация исходных файлов
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 3617; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.