logo search
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

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