Читать «Справочное руководство по C++» онлайн - страница 53

Бьярн Страустрап

 static process* idle;

 //…

public:

 //…

 int state();

 static void reshedule();

 //…

};

Здесь к функции reshedule можно обратиться без указания объекта класса process таким образом:

void f()

{

 process::reshedule();

}

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

void process::reshedule() {/*… */};

int process::no_of_process = 1;

process* process::running = get_main();

process* process::run_chain = process::running;

Статические члены подчиняются обычным правилам доступа к членам класса (§R.11), за исключением того, что их можно инициализировать в файловой области видимости.

В типе статического члена не участвует имя класса, так тип process::no_of_process есть int, а тип &process::reshedule() - void(*)().

R.9.5 Объединения

Объединение можно представить как структуру, все члены имеют нулевое смещения, а размер ее достаточно велик, чтобы вмещать любой из ее членов. В любой момент времени объединение может содержать только один член. В объединении могут быть функции-члены (в том числе конструкторы и деструкторы), но не виртуальные функции (§R.10.2). Объединение не может иметь базовых классов и не может само использоваться в качестве базового класса. Членом объединения не может быть объект класса с конструктором или деструктором, а также с определенной пользователем операцией присваивания (§R.13.4.3). Объединение не может содержать статических членов, представляющих данные.

Объединение вида

union { список-членов }

называется безымянным объединением, оно определяет объект без имени (и без типа). Имена всех членов безымянного объединения должны отличаться от других имен в той области видимости, в которой описано объединение; их можно использовать в этой области видимости непосредственно, без обычных операций доступа к членам (§R.5.2.4).

Приведем пример:

void f()

{

 union { int a; char* p; };

 a = 1;

 //…

 p = "Jennifer";

 //…

}

Здесь a и p используются как обычные переменные (не члены), но поскольку они входят в одно объединение, их адреса совпадают.

Глобальные безымянные объединения можно описать со спецификацией static. Безымянные объединения не должны содержать частных или защищенных членов (§R.11), а также функций-членов.

Если описаны объекты объединения или указатели на него, то оно не считается безымянным, например,

union { int aa; char* p; } obj, *ptr= &obj;

aa = 1; // ошибка

ptr-›aa = 1; // нормально

Здесь присваивание простому имени aa незаконно, т.к. имя члена не привязано ни к какому объекту.

Инициализация объединений, не имеющих конструкторов, описывается в §R.8.4.1.

R.9.6 Битовые поля

Конструкция описатель-члена, имеющая вид,

идентификатор opt : выражение-константа

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