Язык программирования C++


Повышение надежности обращения к общим данным - часть 2


class A { public: static void Method(const A& a); private: static int a1; int a2; }; void A::Method(const A& a) { int x = a1; int y = a2; int z = a.a2; } // обращение к статическому атрибуту // ошибка, a2 не определен // правильно

Статический атрибут класса во многом подобен глобальной переменной, но доступ к нему контролируется классом. Один статический атрибут класса создается в начале программы для всех объектов данного класса (даже если ни одного объекта создано не было). Можно считать, что статический атрибут – это атрибут класса, а не объекта.

Теперь программа, использующая генератор случайных чисел, будет выглядеть так:

// файл main.cpp #include "RandomGenerator.h" main() { RandomGenerator::Init(1000); } void fun1(void) { unsigned long x=RandomGenerator::GetNumber(); . . . }

// файл class.cpp #include "RandomGenerator.h" Class1::Class1() { . . . } void fun2() { unsigned long x=RandomGenerator::GetNumber(); . . . }

Такое построение программы и удобно, и надежно. В отличие от глобальной переменной, второй раз определить генератор невозможно – мы и первый-то раз определили его лишь фактом включения класса RandomGenerator в программу, а два раза определить один и тот же класс компилятор нам не позволит.

Разумеется, существуют и другие способы сделать так, чтобы существовал только один объект какого-либо класса.

Кратко суммируем результаты этого параграфа:

  1. Автоматические переменные заново создаются каждый раз, когда управление передается в соответствующую функцию или блок.
  2. Статические и глобальные переменные создаются один раз, в самом начале выполнения программы.

  3. К глобальным переменным можно обращаться из всей программы.
  4. К статическим переменным, определенным вне функций, можно обращаться из всех функций данного файла.
  5. Хотя использовать глобальные переменные иногда удобно, делать это следует с большой осторожностью, поскольку легко допустить ошибку (нет контроля доступа к ним, можно переопределить глобальную переменную).
  6. Статические атрибуты класса существуют в единственном экземпляре и создаются в самом начале выполнения программы. Статические атрибуты применяют тогда, когда нужно иметь одну переменную, к которой могут обращаться все объекты данного класса. Доступ к статическим атрибутам контролируется теми же правилами, что и к обычным атрибутам.

  7. Статические методы класса используются для функций, по сути являющихся глобальными, но логически относящихся к какому-либо классу.




Начало  Назад  Вперед