Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

R.9.3.2 Функции-члены со спецификацией inline

Функцию-член можно определить ($$R.8.3) в описании класса, в таком случае она считается подстановкой (inline, $$R.7.1.2). Определять функцию в описании класса - это эквивалентно тому, чтобы описывать функцию и определять ее со спецификацией inline сразу же после описания класса. Считается, что такой перенос определения функции происходит после препроцессорной обработки до стадии синтаксического анализа и контроля типов. Поэтому программный фрагмент int b; struct x { char* f() { return b; } char* b; }; эквивалентен int b; struct x { char* f(); char* b; }; inline char* x::f() { return 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: class process { static int no_of_process; static process* run_chain; static process* running; 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(*)().