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

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

 

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

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

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

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

Статические члены описываются с помощью ключевого слова 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;
}

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


Назад: Язык C++

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

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


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

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