Страустрап Бьярн
Шрифт:
char* b;
};
Здесь в функции x::f используется x::b, а не глобальное b.
Функции-члены можно определять даже в описании локальных или вложенных классов, где такой перенос будет синтаксически незаконным. Локальные классы обсуждаются в R.9.8, а вложенные классы в §R.9.7.
R.9.4 Статические члены
Для члена класса, представляющего данные или функцию, можно при описании класса задать спецификацию static. Для статического члена, представляющего данные, в программе существует только один экземпляр, которым владеют все объекты этого класса. Статический член не является частью объекта класса. Статические члены глобального класса подлежат внешнему связыванию (§R.3.3). Описание статического члена, представляющего данные, в описании класса не считается определением. Определение должно быть дано в другом месте, см. также. §R.18.3.
Статическая функция-член не имеет указатель this, поэтому для доступа к нестатическим членам своего класса она должна использовать операции . или -›. Статическая функция-член не может быть виртуальной. Недопустимы статические и нестатические функции-члены с одним именем и одинаковыми типами параметров.
Статические члены локального класса (§R.9.8) не подлежат связыванию и не могут определяться вне описания класса. Отсюда следует, что локальные классы не могут иметь статических членов, представляющих данные.
К статическому члену mem класса c1 можно обращаться как c1::mem (§R.5.1), т.е. независимо ни от какого объекта. К нему также можно обращаться с помощью операций доступа к членам . и -›. Если к статическому члену происходит обращение с помощью операций доступа, выражения, стоящие слева от . или -› не эквивалентны. Статический член mem существует даже, если не создано ни одного объекта класса c1. В примере ниже run_chain, idle и другие члены существуют даже, если не было создано ни одного объекта класса process:
Здесь к функции reshedule можно обратиться без указания объекта класса process таким образом:
Статические члены глобальных классов инициализируются точно так же как глобальные объекты, но область их видимости - файл, например:
Статические члены подчиняются обычным правилам доступа к членам класса (§R.11), за исключением того, что их можно инициализировать в файловой области видимости.
В типе статического члена не участвует имя класса, так тип process::no_of_process есть int, а тип &process::reshedule - void(*).
R.9.5 Объединения
Объединение можно представить как структуру, все члены имеют нулевое смещения, а размер ее достаточно велик, чтобы вмещать любой из ее членов. В любой момент времени объединение может содержать только один член. В объединении могут быть функции-члены (в том числе конструкторы и деструкторы), но не виртуальные функции (§R.10.2). Объединение не может иметь базовых классов и не может само использоваться в качестве базового класса. Членом объединения не может быть объект класса с конструктором или деструктором, а также с определенной пользователем операцией присваивания (§R.13.4.3). Объединение не может содержать статических членов, представляющих данные.
Объединение вида
называется безымянным объединением, оно определяет объект без имени (и без типа). Имена всех членов безымянного объединения должны отличаться от других имен в той области видимости, в которой описано объединение; их можно использовать в этой области видимости непосредственно, без обычных операций доступа к членам (§R.5.2.4).
Приведем пример: