Иногда бывает полезно выделить общую память для всех объектов одного класса. Чтобы получить такую память, следует объявить член-данное со спецификатором static. Ключевое слово static помещается перед типом того данного, которое объявляется статическим. Чтобы статические данные класса стали доступны за пределами класса, необходимо назначить им открытый спецификатор доступа public. Если же данные объявить закрытыми, то потребуются открытые методы для получения их значений.
Перечислим основные свойства статических данных класса:
Статические данные не являются частью объектов класса и хранятся за его пределами. Память для статической переменной-члена при объявлении объекта класса не выделяется.
Одна копия используется всеми объектами класса, следовательно, все объекты имеют одно и то же значение статического данного.
Объявление статических данных в классе не является их описанием, поэтому присваивание им значений производится вне класса и вне функций программы.
Статические данные существуют даже при отсутствии объектов класса, для которого они объявлены как статические.
Доступ к статической переменной-члену со спецификатором public может быть реализован без всякого объекта.
#include <iostream>
using namespace std;
class C{
public:
static double A; // открытый статический член-данное
int m_x, m_y; // нестатические члены-данные
private:
static int B; // закрытый статический член-данное
public:
// конструкторы и деструктор
C(): m_x(0),m_y(0)
{}
C(int х, int у): m_x (x), m_y (y)
{}
~C(){
// метода для статического данного В
void setB (int _b){B =_b; }
int getB () { return В; }
};
// инициализация статических данных
//double C:: A = 2.75;
//int C::В = 777;
// главная функция
int main ()
{
С a(10,10), b(-10, -10);
// вывод состояния нестатических данных
cout << "a\t" << a.m_x << '\t' << a.m_y << endl;
cout << "b\t" << b.m_x << '\t' << b.m_y << endl;
// вывод состояния статических данных
cout << "for a and b static A =\t" << C:: A << endl;
cout << "for a static В =\t" << a.getB () << endl;
cout << "for b static В =\t" << b.getB () << endl;
// изменение и вывод значения А
С:: А = 1.2е308;
cout << "after change A =\t" << С:: А << endl; // изменение значения В в объекте а
a.setB (100);
// вывод значения для В для объекта b
cout << "after change in a b.B =\t" << b.getB () << endl;
// изменение значения В в объекте b
b.setB (-100);
// вывод значения В для объекта а
cout << "after change in b а.В =\t" << a.getB () << endl;
}
В классе с в качестве статических данных объявлены открытая а и закрытая в статические переменные. Инициализация значениями происходит за пределами класса и функции main (), как того требуют правила С++. Изменения значения закрытого статического данного в в объекте а отражаются на объекте b, и наоборот. Для доступа к значениям B требуются методы из-за спецификатора private. Доступ к а происходит обычным способом, так как этот статический член-данное имеет спецификатор доступа public.