|
Программирование >> Дополнительные возможности наследования
Удаление ибъектов При использовании оператора delete, за которым следует идентификатор указателя на объект, вызывается деструктор соответствующего класса. Это происходит еще до освобождения памяти и возвращения ее в область динамического обмена. В деструкторе, как правило, освобождается вся память, занимаемая объектом класса. Пример динамического размещения и удаления объектов показан в листинге 8.5. Листинг 8.5. Размещвиие и удвАенне вОъектов в вОавсшн дннвмнческеге вОмена 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Листинг 8.5. Размещение и удаление объектов в области динамического обмена Sinclude <iostream.h> class SimpleCat { public: SimpleCatO; SimpleCatO; private: int itsAge; SimpleCat::SimpleCat() { cout Constructor called.\ n ; itsAge = 1; SimpleCat:: SimpleCat() { cout Destructor called.\ n ; int main() { cout SimpleCat Frisky...\ n ; SimpleCat Frisky; cout SimpleCat *pRags = new SimpleCat...\ n ; SimpleCat * pRags = new SimpleCat; cout delete pRags...\ n ; delete pRags; cout Exiting, watch Frisky go ,\ n ; return 0; i ; SimpleCat Frisky... * Constructor called. SimpleCat *pRags = new SimpleCat.. Constructor called, delete pRags... Destructor called. Exiting, watch Frisky go . Destructor called. В строках 6-13 приведено описание простейшего класса SimpleCat, Описание конструктора класса находится в строке 9, а его тело - в строках 15-19. Деструктор описан в строке 10, его тело - в строках 21-24. В строке 29 создается экземпляр описанного класса, который размешается в стеке. При этом происходит неявный вызов конструктора класса SimpleCat. Второй объект класса создается в строке 31. Для его хранения динамически вьщеляется память и адрес записывается в указатель pRags. В этом случае также вызывается конструктор. Деструктор класса SimpleCat вызывается в строке 33 как результат применения оператора delete к указателю pRags. При выходе из функции переменная Frisky оказывается за пределами области видимости и для нее также вызывается деструктор. Доступ к членам класса Для локальных переменных, являюшихся объектами класса, доступ к членам класса осушествляется с помощью оператора прямого доступа (.). Для экземпляров класса, созданных динамически, оператор прямого доступа применяется для объектов, полученных разыменованием указателя. Например, для вызова функции-члена GetAge нужно написать: (*pRags).GetAgeO; Скобки указывают на то, что оператор разыменования должен выполняться еще до вызова функции GetAge(). Такая конструкция может оказаться достаточно громоздкой. Решить эту проблему позволяет специальный оператор косвенного обращения к члену класса, по написанию напоминающий стрелку (->). Для набора этого оператора используется непрерывная последовательность двух символов: тире и знака больше . В С++ эти символы рассматриваются как один оператор. Листинг 8.6 иллюстрирует пример обращения к переменным и функциям класса, экземпляр которого размешен в области динамического обмена. Листинг 8.6. Доступ к данным оОъекта в области дниамичвского обмвиа Листинг 8.6. Доступ к данным объекта в области динамического обмена #include <iostream.h> class SimpleCat { public; 9: SimpleCatO { itsAge = 2; } 10: SimpleCatO { } 11: int GetAgeO const { return itsAge; } 12: void SetAge(int age) { itsAge = age; } 13: private: 14: int itsAge; 15: }; 17: int main() 18: { 19: SimpleCat * Frisky = new SimpleCat; 20: cout Frisky Frisky->GetAge() years old\ n 21: Frisky->SetAge(5); 22: cout Frisky Frisky->GetAge() years old\ n 23: delete Frisky; 24: return 0; 25: } : ,-: Frisky 2 years old Frisky 5 years old Z В строке 19 в области динамического обмена выделяется память для хранения экземпляра класса SimpleCat. Конструктор, вызываемый по умолчанию, присваивает новому объекту возраст два года. Это значение получено как результат выполнения функции-члена GetAgeO, которая вызывается в строке 20. Поскольку мы имеем дело с указателем на объект, для вызова функции используется оператор косвенного обращения к члену класса (->). В строке 21 для установки нового значения возраста вызывается метод SetAgeO, а повторный вызов функции GetAgeO (строка 22) позволяет получить это значение. Динамическое размещение членив класса в качестве членов класса могут выступать и указатели на объекты, размещенные в области динамического обмена. В таких случаях выделение памяти для хранения этих объектов осуществляется в конструкторе или в одном из методов класса. Освобождение памяти происходит, как правило, в деструкторе (листинг 8.7.). Листинг 8.7. Указатвди как чавны КАасса Листинг 8,7. Указатели как члены класса Sinclude <iostream,h> class SimpleCat { public: SimpleCatO;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |