|
Программирование >> Структурное программирование
Военное время: 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()
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |