Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Int main () {

Anything first;

Anything second;

first.s_value = 4;

std::cout << first.s_value << '\n';

std::cout << second.s_value << '\n';

return 0;

}

Результат выполнения программы:

4

4

Поскольку s_value является статической переменной-членом, то она является общей для всех объектов класса Anything.

Следовательно, first.s_value — это та же переменная, что и second.s_value.

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

Статические члены не связаны с объектами класса

Хотя вы можете получить доступ к статическим членам через разные объекты класса (как в примере, приведенном выше), но, оказывается, статические члены существуют, даже если объекты класса не созданы!

Подобно глобальным переменным, они создаются при запуске программы и уничтожаются, когда программа завершает свое выполнение.

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

Поскольку s_value существует независимо от любых объектов класса, то доступ к нему осуществляется напрямую через имя класса и оператор разрешения области видимости в данном случае, через ::

Anything::s_value

#include <iostream>

class Anything {

public:

static int s_value; // объявляем статическую переменную-член

};

// определяем статическую переменную-член

int Anything::s_value = 3;

Int main () {

// Примечание: Мы не создаем здесь никаких объектов класса //Anything

Anything::s_value = 4;

std::cout << Anything::s_value << '\n';

return 0;

}

В вышеприведенном фрагменте доступ s_value осуществляется через имя класса, а не через объект этого класса. Обратите внимание, мы даже не создавали объект класса Anything, но мы все равно имеем доступ к Anything::s_value и можем использовать эту переменную-член.

Определение и инициализация статических переменных-членов класса

Когда мы объявляем статическую переменную-член внутри тела класса, то мы сообщаем компилятору о существовании статической переменной-члене, но не о её определении, аналогией является предварительное объявление.

Поскольку статические переменные-члены не являются частью отдельных объектов класса (они обрабатываются аналогично глобальным переменным и инициализируются при запуске программы), то вы должны явно определить статический член вне тела класса — в глобальной области видимости!!!

В программе, приведенной выше, это делается следующей строкой кода:

int Anything::s_value = 3; // определяем статическую переменную-

//член

Здесь мы определили статическую переменную-член класса и инициализировали её значением 3. Если же инициализатор не предоставлен, то C++ инициализирует s_value значением 0.

Обратите внимание, данное определение статического члена не подпадает под действия спецификаторов доступа: вы можете определить и инициализировать s_value, даже если он будет private (или protected).

Если класс определен в заголовочном файле, то определение статического члена обычно помещается в файл с кодом класса (например, в Anything.cpp).

Если класс определен в файле .cpp, то определение статического члена обычно пишется непосредственно под классом.

Не пишите определение статического члена класса в заголовочном файле (подобно глобальным переменным).

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