Программирование >>  Расширенная версия языка c++ 

1 ... 128 129 130 [ 131 ] 132 133 134 ... 227


/лава 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). Модифицируемый член класса можно изменить с помощью постоянной функции-члена.

Примеры

Функция-член объявляется постоянной, чтобы предотвратить возможность изменения вызвавшего ее объекта. Для примера рассмотрим следующую программу.



1 ... 128 129 130 [ 131 ] 132 133 134 ... 227

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