R Справочное руководство по С++

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(*)().


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.