Справочное руководство по C++ | страница 59
>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 : выражение-константа
задает битовое поле, длина которого отделяется от его имени двоеточием. Размещение битовых полей в объекте класса зависит от реализации. Поля упаковываются в некоторые адресуемые элементы памяти. На одних машинах поля могут выходить за границы этих элементов, на других - нет. Выравнивание битовых полей тоже определяется реализацией. На одних машинах значения помещаются в битовые поля справа налево, на других - слева направо.