|
|
Для члена класса, представляющего данные или функцию, можно при описании
класса задать спецификацию 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(*)().
| |