Программирование >>  Дополнительные возможности наследования 

1 ... 63 64 65 [ 66 ] 67 68 69 ... 265


Удаление ибъектов

При использовании оператора 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;



1 ... 63 64 65 [ 66 ] 67 68 69 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика