Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
86
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

632

class Token { public:

TokenKind tok;

// анонимное объединение union {

char _cval; int _ival; char *_sval; double _dval;

};

};

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

int lex() {

Token curToken; char *curString; int curIval;

//... выяснить, что находится в лексеме

//... затем установить curToken

case ID: curToken.tok = ID;

curToken._sval = curString; break;

case Constant: // целая константа curToken.tok = Constant; curToken._ival = curIval; break;

// ... и т.д.

предыдущее определение:

}

Анонимное объединение позволяет убрать один уровень доступа, поскольку обращение к его членам идет как к членам класса Token. У него не может быть закрытых или защищенных членов, а также функций-членов. Такое объединение, определенное в глобальной области видимости, должно быть объявлено в безымянном пространстве имен или иметь модификатор static.

13.8. Битовое поле член, экономящий память

Для хранения заданного числа битов можно объявить член класса специального вида, называемый битовым полем. Он должен иметь целый тип данных, со знаком или без

class File { // ...

unsigned int modified : 1; // битовое поле

знака:

};

С++ для начинающих

633

После идентификатора битового поля следует двоеточие, а за ним константное выражение, задающее число битов. К примеру, modified это поле из одного бита.

Битовые поля, определенные в теле класса подряд, по возможности упаковываются в соседние биты одного целого числа, делая хранение объекта более компактным. Так, в

следующем объявлении пять битовых полей будут содержаться в одном числе типа

typedef unsigned int Bit;

class File { public:

Bit mode: 2; Bit modified: 1;

Bit prot_owner: 3; Bit prot_group: 3; Bit prot_world: 3; // ...

unsigned int, ассоциированном с первым полем mode:

};

Доступ к битовому полю осуществляется так же, как к прочим членам класса. Скажем, к битовому полю, являющемуся закрытым членом класса, можно обратиться лишь из

void File::write()

{

modified = 1; // ...

}

void File::close()

{

if ( modified )

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

функций-членов и друзей этого класса:

}

Вот простой пример использования битового поля длиной больше 1 (примененные здесь

enum { READ = 01, WRITE = 02 }; // режимы открытия файла

int main() { File myFile;

myFile.mode |= READ;

if ( myFile.mode & READ )

cout << "myFile.mode is set to READ\n";

побитовые операции рассматривались в разделе 4.11):

}

Обычно для проверки значения битового поля-члена определяются встроенные функции- члены. Допустим, в классе File можно ввести члены isRead() и isWrite():