Энциклопедия C++ Builder




ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ И C++ - часть 31


В C++ применение ключевого слова

volatile распространяется на классы и функции-члены. Это ключевое слово запрещает компилятору делать предположения относительно значения указанного объекта, поскольку при вычислении выражений, включающих этот объект, его значение может измениться в любой момент. Кроме того. непостоянная переменная не может быть объявлена с модификатором register. Листинг 3.20 показывает пример реализации таймера, в котором переменная ticks модифицируется обработчиком временных прерываний.

volatile int ticks;

void timer( ) // Объявление функции таймера

ticks++;

void wait (int interval)

ticks = 0;

while (ticks < interval); // Цикл ожидания

}

Листччг 3.20. Изменение непостоянной переменной volatile.

Положим, что обработчик прерывания

timer был надлежащим образом ассоциирован с аппаратным прерыванием от часов реального времени. Процедура wait реализует цикл ожидания, пока значение переменной

ticks не станет равным интервалу времени, заданному ее параметром. Компилятор C++ обязан перезагружать значение переменной

volatile ticks перед каждым сравнением внутри цикла - несмотря на то, что внутри цикла значение переменной не изменяется. Некоторые оптимизирующие компиляторы могли бы допустить эту "роковую" ошибку.

Другой вид непостоянной переменной, которая может быть изменена даже если она входит в константное выражение, объявляется с помощью модификатора mutable:

mutable <имя переменной>;

Назначение ключевого слова mutable состоит в спецификации членов данных некоторого класса, которые могут быть модифицированы константными функциями этого класса. Листинг 3.21 показывает пример, в котором член данных count модифицируется константной функцией F1.

class A {

public: mutable int count; int F1 (int p = 0) const

// Объявление функции F1

count = p++ return count; //PI

возвращает count

) I

void main() {

A a;

cout “ a.Fl(3) “ end.1; // main

выдает значение 4 )

Листинг 3.21. Изменение непостоянной переменной mutable.




Содержание  Назад  Вперед