Статические члены класса

Язык C++ / Статические члены класса

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

Статические данные относятся ко всем объектам класса. Такие данные используются, если

  • требуется контроль общего количества объектов класса;
  • требуется одновременный доступ ко всем объектам или части их;
  • требуется разделение объектами общих ресурсов.

В этом случае в определение класса могут быть введены статические члены.

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

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

Обращение к статическому элементу осуществляется с помощью оператора разрешения контекста и имени класса:

ИмяКласса :: ИмяЭлемента

Если x – статическое член-данное класса cl, то к нему можно обращаться как

cl::x

При этом не имеет значения количество объектов класса cl.
Аналогично можно обращаться к статической член-функции:

class X {
 public:
   int n;
   static void func(int v);
   void f(int v);
...
};
int main() {
  X obj;
  obj.f(10)  // для любой функция
  X :: func(10);  // только для статической функции
  return 0;
}

Статические член-данные класса можно рассматривать как глобальную переменную класса. Но в отличие от обычных глобальных переменных на статические члены распространяются правила видимости private и public. Поместив статическую переменную в часть private, можно ограничить ее использование.

Объявление статического члена в объявлении класса не является определением, то есть это объявление статического члена не обеспечивает распределения памяти и инициализацию.

Инициализация статических член-данных

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

class example {
  public:
    static int mask;
};
int example::mask = 0; // определение и инициализация

Пример

#include <iostream>
using namespace std;
class temp {
  static int number;
  static char name[30];
  int id;
public:
  void setid(void);
  int getid(void);
  static char* getname(void);
};
int temp :: number = 0;
char temp :: name[] = "ClassName";
char* temp :: getname() {return(name); }
void temp :: setid(void) {
  number++;
  id = number;
}
int temp :: getid(void) {return(id);}
int main() {
  temp a, b;
  a.setid();
  b.setid();
  cout << "a.id = " << a.getid() << endl;
  cout << "b.id = " << b.getid() << endl;
  cout << temp::getname();
  cin.get();
  return 0;
}

Результат выполнения
Статические члены класса
Назад

Комментариев к записи: 1

  • Angry Birds Rio

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


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *