×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 692 из 714 Настройки
Вложенные локальные классы

Вполне возможно вложить класс в локальный класс. В данном случае определение вложенного класса может располагаться вне тела локального класса. Однако вложенный класс следует определить в той же локальной области видимости, в которой определен локальный класс:

>void foo() {

> class Bar {

> public:

>  // ...

>  class Nested; // объявление класса Nested

> };

> // определение класса Nested

> class Bar::Nested {

>  // ...

> };

>}

Как обычно, при определении члена вне класса следует указать область видимости имени. Следовательно, определение >Bar::Nested означает класс >Nested, определенный в пределах класса >Bar.

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

19.8. Возможности, снижающие переносимость

Для поддержки низкоуровневого программирования язык С++ определяет набор средств, применение которых снижает переносимость приложений. Непереносимое (nonportable) средство специфично для определенных машин. Использующие такие средства программы зачастую требуют переделки кода при переносе с одной машины на другую. Одной из причин невозможности переноса является тот факт, что размеры арифметических типов на разных машинах разные (см. раздел 2.1.1).

В этом разделе рассматриваются два дополнительных средства, снижающих переносимость, унаследованных языком С++ от языка С: речь идет о битовых полях и спецификаторе >volatile. Также будут рассмотрены директивы компоновки, которые тоже снижают переносимость.

19.8.1. Битовые поля

Класс может определить (нестатическую) переменную-член как битовое поле (bit-field). Битовое поле хранит определенное количество битов. Обычно битовые поля используются при необходимости передать двоичные данные другой программе или аппаратному устройству.

Расположение в памяти битовых полей зависит от конкретной машины.

У битового поля должны быть целочисленный тип или тип перечисления (см. раздел 19.3). Для битового поля обычно используют беззнаковый тип, поскольку поведение битового поля знакового типа зависит от реализации. Чтобы объявить член класса битовым полем, после его имени располагают двоеточие и константное выражение, указывающее количество битов:

>typedef unsigned int Bit;

>class File {

> Bit mode: 2;       // mode имеет 2 бита

> Bit modified: 1;   // modified имеет 1 бит

> Bit prot_owner: 3; // prot_owner имеет 3 бита

> Bit prot_group: 3; // prot_group имеет 3 бита

> Bit prot_world: 3; // prot_world имеет 3 бита

> // функции и переменные-члены класса File

>public:

> // режимы файла определены как восьмеричные

> // литералы; см. p. 2.1.3

> enum modes { READ = 01, WRITE = 02, EXECUTE = 03 };

> File &open(modes);

> void close();

> void write();

> bool isRead() const;

> void setWrite();

>}

Битовое поле >mode имеет размер в два бита, битовое поле >modified — только один, а другие — по три бита. Битовые поля, определенные в последовательном порядке в теле класса, если это возможно, упаковываются в смежных битах того же целого числа. Таким образом достигается уплотнение хранилища. Например, пять битовых полей в приведенном выше объявлении будут сохранены в одной переменной типа