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

Иногда бывает полезно выделить общую память для всех объектов одного класса. Чтобы получить такую память, следует объявить член-данное со спе­цификатором 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.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: