Программирование >>  Структурное программирование 

1 ... 159 160 161 [ 162 ] 163 164 165 ... 342


Военное время: 18:30:22 Стгшдартное время: 6:30:22РМ

Новое стгиздартное время: 8:20:20РМ

Рис. 7.8. Сцепление вызовов функций-элементов (часть 5 из 5)

7.6. Динамическое распределение памяти с помощью операций new и delete

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

TypeName *typeNamePtr;

В Си ANSI, чтобы динамически создать объект типа TypeName, вы должны написать:

typeNamePtr = malloc{sizeof{)) ;

Это требует вызова функции malloc и явной ссылки на операцию sizeof. В версии С, предшествующей С ANSI, вы должны были бы также привести тип указателя, возвращенного malloc, операцией приведения типа (TypeName *). Функция malloc не обеспечивает никакого метода инициализации выделяемого блока памяти. В С-Ы- вы просто пишете

typeNamePtr = new TypeName;

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

Чтобы освободить пространство, выделенное ранее для этого объекта, в С+-Н вы должны использовать операцию delete в следующем виде:

delete typeNamePtr;

С-Н- позволяет вам использовать инициализатор для только что созданного объекта

float *thingPtr = new float {3.14159);

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

Массив можно создать и присвоить его chessBoardPtr в следующем виде:

int *chessBoardPtr = new int{8}{8};

Этот массив может быть уничтожен с помощью оператора

delete {} chessBoardPtr;



7.7. Статические элементы класса

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

Совет по повышению эффективности 7.3

Если вам доааточно единственной копии данных, используйте для сокращения затрат памяти аатические данные-элементы.

Хотя может показаться, что статические элементы данные похожи на глобальные переменные, тем не менее они имеют областью действия класс. Статические элементы могут быть открытыми, закрытыми или защищенными (protected). Статическим данным-элементам можно задать начальные значения один (и только один) раз в области действия файл. Доступ к открытым статическим элементам класса возможен посредством любого объекта класса или посредством имени класса, с помощью бинарной операции разрепзения области действия. Закрытые и защищенные статические элементы класса должны быть доступны открытым функциям-элементам этого класса или друзьям класса. Статические элементы класса существуют даже тогда, когда не существует никаких объектов этого класса. Чтобы в этом случае обеспечить доступ к открытому статическому элементу, просто поставьте перед элементом данных имя класса и бинарную операцию разрешения области действия. Для обеспечения доступа в указанном случае к закрытому или защищенному элементу класса должна быть предусмотрена открытая статическая функция-элемент, которая должна вызываться с добавлением перед ее именем имени класса и бинарной операции разрешения области действия.

Как мы увидим, использование new и delete вместо malloc и free дает и другие преимущества. В частности, new автоматически активизирует конструктор, а delete автоматически активизирует деструктор класса.

Типичная ошибка программирования 7.8

Смешивание способов динамического распределения памяти в аиле new-delete со стилем malloc-free: пространаво, созданное с помощью malloc, не может быть освобождено с помощью delete; объекты, созданные с помощью new, не могут быть уничтожены с помощью free.

Хороший стиль программирования 7.3

Хотя программы на С-Ы- могут поддерживать память, выделяемую с помощью malloc и уничтожаемую с помощью free, и объекты, создаваемые с помощью new и уничтожаемые с помощью delete, лучше использовать только new и delete.



ENPL0Y1.H Класс employee #ifndef EMPL0Y1 H #define EMPL0Y1 H

class Employee { public:

Employee(const char*, const char*); конструктор -Employee О; деструктор

const char *getFirstName() const; возвращает имя

const char *getLastName() const; возвращает фамилию

статическая функция-элемент

static int getCountО; возвращает число

созданных объектов

private:

char *firstName; char *lastName;

статический элемент данных

static int count; число созданных объектов

* #endif

Рис. 7.9. Использование статического элемента данных для подсчета количества объектов

класса (часть 1 из 5)

Программа на рис. 7.9 демонстрирует использование закрытого статического элемента данных и открытой статической функции-элемента. Элементу данных count задается нулевое начальное значение в области действия файл с помощью оператора

int Employee::count = 0;

Элемент данных count обслуживает подсчет количества объектов класса Employee, которые были созданы. Если объекты класса Employee существуют, элемент count может быть вызван посредством любой функции-элемента объекта Employee (в данном примере посредством как конструктора, так и деструктора). Если никаких объектов класса Employee не существует, элемент count также может быть вызван, но только посредством вызова статической функции-элемента getCount следующим образом:

Employee::getCount()

В этом примере функция getCount использована для определения текущего числа созданных объектов класса Employee. Отметим, что когда в программе еще не создано ни одного объекта, используется вызов функции Ет-ployee::getCount(). Но когда объекты уже созданы, функция getCount может быть вызвана из одного из объектов оператором

elPtr->getCount()



1 ... 159 160 161 [ 162 ] 163 164 165 ... 342

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