Статические члены класса : поля и методы класса

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

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

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

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

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

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

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

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

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

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

cl::x

При этом не имеет значения количество объектов класса cl.

Аналогично можно обращаться к статическому методу:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
class X 
{
public:
  static int func(int v) { return 10 * v; };
  int f(int v) { return 10 * v; };
};
int main() 
{
  X obj;
  cout << obj.f(10) << endl;  // для любой функция
  cout << X::func(10) << endl;  // только для статической функции
  cin.get();
  return 0;
}

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

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

Инициализация статических полей

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
class X 
{
  static int n;
public:
  static int getN() { return n; };
  static int setN(int value) { n = value; }
};
int X::n = 0; // инициализация скрытого статического поля
int main() 
{
  cout << X::getN() << endl; 
  X::setN(10);
  cout << X::getN() << endl; 
  //cout << X::n << endl; // ошибка - скрытое поле класса
  cin.get();
  return 0;
}

Пример

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
class X 
{
  static int n;
  static char ClassName[30];
public:
  static int getN() { return n; }
  static char* getClass() { return ClassName; }
  X() { n++; } // конструктор
};
int X::n = 0;
char X::ClassName[] = "My Class";
int main() 
{
  X a, b, c; // описываем 3 объекта класса X
  cout << X::getN() << " objects of Class \"" << X::getClass() << "\"" << endl; 
  cin.get();
  return 0;
}

Результат выполнения

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

Оставьте комментарий

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

Прокрутить вверх