Static — это ключевое слово в C++, используемое для придания элементу особых характеристик. Статические элементы инициализируются только один раз и сохраняют свое значение на протяжении всей программы.
Ключевое слово «static» можно разложить на:
- Статические переменные-члены в классе
- Объекты статического класса
- Класс статических методов
Статические переменные-члены в классе
Статическая переменная никогда не размещается в стеке. Ей выделяется место на разных статических хранилищах. Это означает, что когда мы объявляем статическую переменную в классе, эта переменная используется всеми объектами этого класса.
Поскольку статические переменные инициализируются только один раз и являются общими для всех объектов класса, статические переменные никогда не инициализируются конструктором. Вместо этого статическая переменная должна быть явно инициализирована вне класса только один раз с использованием оператора разрешения области видимости (::).
Когда создается первый объект, все статические данные примитивного типа инициализируются нулем, если нет другой инициализации.
Как показано в приведенном ниже коде, у нас есть статическая переменная count как член примера класса. Обратите внимание, что мы инициализировали эту переменную явно вне класса с начальным значением = 0; Затем мы увеличиваем эту статическую переменную в конструкторе класса.
Давайте посмотрим на пример программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> using namespace std; class sample{ int var; static int count; public: sample(int var):var(var){ cout<<"Count = "<<count<<endl; count++; } }; int sample::count = 0; //инициализация статической переменной int main() { sample s(2), s1(10),s3(1); } |
Вывод данных:
Count = 0 Count = 1 Count = 2 |
В основной функции мы создаем три разных объекта. В выводе видно, что значение статической переменной сохраняется между созданиями объекта и не сбрасывается при каждом создании объекта. Для первого объекта count = 0. Затем он увеличивается до 1. Для следующего объекта count = 1 и так далее.
Если бы счетчик был любой обычной переменной, то вывод данных был бы таким:
Count = 0 Count = 0 Count = 0 |
Объекты статического класса
Точно так же, как и статические переменные, мы можем объявлять объекты класса как статические. Объекты статического класса также инициализируются только один раз и остаются активными на протяжении всей программы. Поскольку объект является определяемым пользователем типом, объект статического класса инициализируется аналогично обычным объектам с использованием конструктора.
Давайте рассмотрим пример для лучшего понимания работы объектов статического класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> using namespace std; class xyz { int i; public: xyz() { i=0; cout << "Constructor::xyz"<<endl; } ~xyz() { cout << "Destructor::xyz"<<endl; } }; int main() { int x=0; if(x==0){ static xyz obj; } cout << "End Main"<<endl; } |
В этой программе есть класс xyz с конструктором и деструктором. В основной функции мы объявляем переменную x = 0; Если x равен нулю, мы создаем статический объект класса xyz.
Вывод данных:
Constructor::xyz End Main Destructor::xyz |
Обычно, вывод данных должен был выводиться такой:
Constructor::xyz Destructor::xyz End Main |
Но поскольку мы создаем статический объект, этот объект имеет область действия до конца программы, а не тогда, когда объект выходит из области видимости (конец оператора if). По этой причине деструктор объекта obj выполняется только после достижения конца основной функции.
Статические методы в классе
Также могут встречаться статические методы в классе. Точно так же, как статические объекты и статические переменные-члены, статические функции-члены также имеют область действия до завершения выполнения программы.
Когда метод класса объявляется статическим, он может обращаться только к статическим членам, то есть к статическим переменным и статическим функциям класса. Он не может получить доступ к обычным членам класса.
Кроме того, для статических методов класса нет указателя this.
Нам разрешено использовать объект и оператор точки для доступа к статическим методам класса, но рекомендуется использовать имя класса и оператор разрешения области для доступа к этим методам.
Ниже будет приведен пример использования статического метода в классе.
В этом примере мы определили две статические переменные-члены A и B и статический метод printValues. Переменные A и B инициализируются значениями 10 и 20 соответственно. В статическом методе printValues значения A и B подвергаются постинкрементному и предварительному инкрементированию соответственно. После этого распечатываются значения.
В основном методе мы напрямую вызываем статический метод printValues, используя имя класса, поскольку нам не нужен какой-либо объект для вызова статических функций.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> using namespace std; class Sample { static int A; static int B; public: static void printValues(){ A++; ++B; cout <<"Value of A: " << A << endl; cout <<"Value of B: " << B << endl; } }; int Sample :: A =10; int Sample :: B =20; int main(){ Sample::printValues(); return 0; } |
Вывод данных:
Value of A: 11 Value of B: 21 |
Итак, в выводе данных можно видеть, что значения обеих статических переменных изменяются в соответствии с выполняемыми над ними операциями.
Назначение статических функций
Рассмотрев различные варианты использования ключевого слова static в этой статье, остается вопрос, какова цель статических функций.
Назначение статических функций можно резюмировать следующим образом:
- Мы используем статические функции, когда эта функция не зависит от объекта для вызова и работы.
- Еще одна цель использования статической функции — ограничение ее использования. В отличие от глобальных функций, доступ к статическим функциям ограничен файлом, в котором они находятся. Таким образом, чтобы ограничить доступ к функции, мы делаем ее статической.
- Помимо двух вышеуказанных причин, мы используем статические функции, когда не хотим создавать объект класса только для выполнения функции, которая не ссылается ни на какие члены класса.
Итог
В заключение этой статьи мы можем сказать, что ключевое слово static в C++ может использоваться различными способами для объявления переменных, переменных-членов, объектов класса, методов и т.д.
Доступ к статическим функциям-членам и переменным не требуется с помощью объекта, к ним можно обращаться напрямую, используя имя класса. Кроме того, область действия статических функций сохраняется на протяжении всего выполнения программы. Следовательно, статическое ключевое слово также может использоваться для управления доступом к конкретному объекту.
В нашей следующей статье мы вам расскажем об абстракции в C++.
С Уважением, МониторБанк