![]() |
|
Программирование >> Расширенная версия языка c++
/лава 13. Пространства име ругие темы 399 последовательности событий. Чтобы понять, как с помощью статических переменных-членов можно управлять доступом к разделяемым ресурсам, изучите следующую программу. В ней создается класс output, который поддерживает общий выходной буфер outbuf, являющийся статическим символьным массивом. Этот буфер используется для получения выходной информации, передаваемой функцией-членом outbuf(). Эта функция посимвольно передает содержимое строки str. Сначала функция запрашивает доступ к буферу, а затем передает в него все символы str. Функция предотвращает доступ в буфер другим объектам до окончания вывода. Понять работу программы можно по комментариям к ней. Пример разделения ресурсов ttinclude <iostream> #include <cstring> using namespace std; class output { static char outbuf[255]; это разделяемые ресурсы static int inuse; если переменная inuse равна О, буфер доступен; иначе - нет static int Oindex; индекс буфера . char strtaO] ; ... ! .. int i; индекс следующего вола строки int who; идентификатор объекта должен быть положительным public: output (int w, char *s) { strcpy(str, s); i = O; who = w; - . - /* Эта функция возвращает -1 при ожидании буфера; 0 - при завершении вывода; who - если буфер все еще используется. int putbufО if(!3tr[i]) { вывод завершен inuse =0; освобождение буфера return 0; признак .сту-и-.мппу if (!inuse) inuse =who; захвй буфера if(inuse != who) return -1; буфер кто-то использует if(str[i]) { солы еще остались outbuf[oindex] = str[i]; i++; oindex++; outbuf [oindex] 0; последн всегда идет нуль return 1; . ; } -II , <Vi-Ci return 0; . . ----.i.. fcU-niV voi w() { cout outbuf \n;) ., -i>->J . . c; i - cha tbuf[255]; это разделяемые ресурсы in ::inuse = 0; если переменная inuse равна О, буфер доступен; иначе - нет in oindex = 0; индекс буфера . .. ... jj-j int main О output о1(1, Это проверка ), о2(2, статических переменных ); whil tbufO bufO); ывод символов Ol.showO; return 0; 4. Статические функции-члены применяются достаточно редко, но для предварительной (до создания реального объекта) инициализации закр1т1х статических данных-членов они могут оказаться очень удобными. Например, ниже представлена совершенно правильная программа. linclude <io3treain> using namespace std; . . . . clas unc demo { - , static int i; . . , public: static voi {int x) { i = x; } f/.C ,[ void ShowO { cout i; } . li in mc demo::i; определение переменной i инициализация статических данных еще до создания объекта 3tatic func demo::init(100) ; static func demo x; x.shovjO; вывод на экран значения 100 - return 0; Здесь вызов функции initO инициализирует переменную i еще до создания объекта типа static №пс demo. ![]() 1. Переделайте пример 3 так, чтобы на экране отображался тот объект, который осуществляет вывод символов, и тот объеьсг или те объекты, для которых из-за занятости буфера вывод запрещен. 2. Одним из интересных применений статических переменных-членов является хранение информации о количестве объектов класса, существующих в каждый конкретный момент времени. Для этого необходимо увеличивать на единицу статическую переменную-член каждый раз, когда вызывается конструктор класса, и уменьшать на единицу, когда вызывается деструктор. Реализуйте эту схему и продемонстрируйте ее работу. 13.4. Постоянные и модифицируемые члены класса Функции - члены класса могут объявляться постоянными (с идентификатором const). Если функция объявлена постоянной, она не может изменить вызывающий ее объект. Кроме этого, постоянный объект не может вызвать непостоянную функцию-член. Тем не менее, постоянная функция-член может вызываться как постоянными, так и непостоянными объектами. Для задания постоянной функции-члена используйте ее форму, представленную в следующем примере: class X { . ., уи. - - /-Г-- - int 3ome var; *.. , ,. Ij-... public: . .г,- , i .-. int fl() const; постоянная функция-член , , . , ,:>.уг Обратите внимание, что ключевое слово указывают следом за списком параметров функции, а не перед именем функции. Возможна ситуация, когда вам понадобится, чтобы функция-член, оставаясь постоянной, тем не менее была способна изменить один или несколько членов класса. Это достигается заданием модифицируемых членов класса (ключевое слово mutable). Модифицируемый член класса можно изменить с помощью постоянной функции-члена. Примеры Функция-член объявляется постоянной, чтобы предотвратить возможность изменения вызвавшего ее объекта. Для примера рассмотрим следующую программу.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |