×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 693 из 714 Настройки
, ассоциированной с первым битовым полем >mode. Способ упаковки битов в целое число зависит от машины.

К битовому полю не может быть применен оператор обращения к адресу (>&), поэтому не может быть никаких указателей на битовые поля классов.

Для битовых полей обычно лучше подходит беззнаковый тип. Поведение битовых полей, хранимых в переменной знакового типа, определяет конкретная реализация.

Использование битовых полей

К битовым полям обращаются так же, как и к другим переменным-членам класса:

>void File::write() {

> modified = 1;

> // ...

>}

>void File::close() {

> if (modified)

>  // ... сохранить содержимое

>}

Для манипулирования битовыми полями с несколькими битами обычно используют встроенные побитовые операторы (см. раздел 4.8):

>File &File::open(File::modes m) {

> mode |= READ; // установить бит READ по умолчанию

> // другая обработка

> if (m & WRITE) // если открыто для чтения и записи

>  // процесс открытия файла в режиме чтения/записи

> return *this;

>}

Классы, определяющие члены битовых полей, обычно определяют также набор встраиваемых функций-членов для проверки и установки значений битовых полей:

>inline bool File::isRead() const { return mode & READ; }

>inline void File::setWrite() { mode |= WRITE; }

19.8.2. Спецификатор >volatile

Смысл спецификатора >volatile полностью зависит от конкретной машины и может быть выяснен только в документации компилятора. При переносе на новые машины или компиляторы программы, использующие спецификатор >volatile, обычно приходится переделывать.

Программы, которым приходится работать непосредственно с аппаратными средствами, зачастую имеют элементы данных, значением которых управляют процессы, не контролируемые самой программой. Например, программа могла бы содержать переменную, значение которой изменяет системный таймер. Такой объект должен быть объявлен со спецификатором >volatile, тогда его значение может быть изменено способами, не контролируемыми или не обнаруживаемыми компилятором. Ключевое слово >volatile — это приказ компилятору не выполнять оптимизацию для таких объектов.

Спецификатор >volatile используется аналогично спецификатору >const, т.е. как дополнительный модификатор типа:

>volatile int display_register; // значение int может измениться

>volatile Task *curr_task;   // curr_task указывает на объект volatile

>volatile int iax[max_size]; // каждый элемент в iax volatile volatile

>Screen bitmapBuf;           // каждый член bitmapBuf volatile

Между спецификаторами типа >const и >volatile нет никакой взаимосвязи. Тип может быть и >const, и >volatile, тогда у него есть оба качества.

Точно так же класс может определить константные функции-члены, а может и асинхронно-изменяемые (volatile). Только асинхронно-изменяемые функции-члены могут быть вызваны асинхронно-изменяемым (>volatile) объектом.

Взаимодействие указателей со спецификатором >const описано в разделе 2.4.2. Аналогичное взаимодействие существует между указателями и спецификатором >volatile. Можно объявлять асинхронно-изменяемые указатели на объекты, указатели на асинхронно-изменяемые объекты и асинхронно-изменяемые указатели на асинхронно-изменяемые объекты.