Статическая функция-член в C++ (примеры)

Что такое статическая функция в C++?

В классах C++ статический член — это член класса, принадлежащий классу, а не его объектам. У вас будет только одна копия членства. Это происходит независимо от количества создаваемых вами объектов.

Когда функция класса определена как статическая, все объекты класса имеют общий статический член класса. Таким образом, к статической функции можно получить доступ без создания каких-либо объектов класса, и она становится независимой от объекты класса. Статический член данных в C++ может обращаться к другим статическим функциям только за пределами класса.

Зачем использовать статические функции?

В отличие от глобальных функций C++, статические функции доступны только из файла объявления. Если есть необходимость ограничить доступ к функции, сделайте ее статической.

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

Определение статических функций в C++

Синтаксис:

static int myfunc(void)
{
    cout("Example of C++ static function ");
}

В приведенном выше примере мы определяем статическую функцию с именем myfunc. Обратите внимание на использование ключевого слова static в определении. Ключевое слово стоит перед именем функции.

Статическая функция-член в C++

Когда член функции объявляется статическим, он становится независимым от других объектов класса. Вы можете вызвать статическую функцию-член, даже если других объектов класса не существует.

Чтобы получить доступ к именам классов, вы должны использовать имя класса и оператор разрешения области. (::). Статическая функция может обращаться только к другим статическим функциям, статическим членам данных и другим функциям вне класса. Область действия статических функций-членов находится внутри класса, и они не могут получить доступ к этому указателю класса.

Пример 1

#include<iostream>
using namespace std;
class BoxClass {
public:
	static int count;
	BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) {
		cout << "Class constructor called." << endl;
		length = l;
		breadth = b;
		height = h;
		count++;
	}
	double getVolume() {
		return length * breadth * height;
	}
	static int getCount() {
		return count;
	}
private:
	double length;     
	double breadth;    
	double height;     
};
int BoxClass::count = 0;
int main(void) {
	cout << "Inital value of count is : " << BoxClass::getCount() << endl;
	BoxClass Box1(3.2, 1.4, 1.8);    
	BoxClass Box2(7.5, 4.0, 4.0);   
	cout << "Final value of count is : " << BoxClass::getCount() << endl;
	return 0;
}

Вывод:

Статическая функция-член

Вот скриншот кода:

Статическая функция-член

Пояснение к коду:

  1. Включение заголовочного файла iostream в нашу программу на C++ для использования его Функции.
  2. Включите пространство имен std в код, чтобы использовать его классы без его вызова.
  3. Создайте класс с именем BoxКласс.
  4. Используйте модификатор публичного доступа, чтобы пометить член класса, который является общедоступным.
  5. Объявление статического члена класса с именем count.
  6. Используйте конструктор класса для инициализации трех переменных класса. double тип.
  7. Напечатайте текст на консоли. Функция endl (конец строки) перемещает курсор мыши на следующую строку.
  8. Инициализируйте значение l переменной длины.
  9. Инициализируйте значение b переменной ширины.
  10. Инициализируйте значение h переменной высотой.
  11. Затем увеличивайте значение переменной count на 1 каждый раз, когда создается новый объект.
  12. Конец тела конструктора.
  13. Создайте функцию с именем doubleобъем().
  14. Определите, что doubleФункция Volume() вернется. Он должен возвращать произведение переменных длины, ширины и высоты.
  15. Конец doubleТело функции Volume().
  16. Объявите статическую функцию с именем getCount().
  17. Функция getCount() должна возвращать значение переменной count.
  18. Конец тела функции getCount().
  19. Используйте модификатор частного доступа, чтобы пометить члена класса как общедоступного.
  20. Объявление члена класса с именем length of a double тип данных. Доступ будет в частном порядке.
  21. Объявите еще одного члена класса с именем width of a double тип данных. Доступ будет в частном порядке.
  22. Объявление члена класса с именем height of double тип данных. Доступ будет в частном порядке.
  23. Конец тела BoxКласс класс.
  24. Затем инициализируйте статический член BoxКласс класс.
  25. Вызов функции main(). Логику программы C++ следует добавить в тело этой функции.
  26. Выведите на консоль текст, указав текущее количество объектов перед созданием новых объектов.
  27. Объявите объект с именем Box1, который является одним из экземпляров класса BoxСорт. Значения ширины, длины и высоты следует указывать в скобках.
  28. Объявите объект с именем Box2, который является экземпляром класса BoxСорт. Значения ширины, длины и высоты указаны в скобках.
  29. Выведите на консоль текст, указывающий текущее количество объектов после создания новых объектов.
  30. Программа на C ++ должен возвращать значение после успешного завершения.
  31. Конец тела функции main().

Доступ к статическим функциям

Вам не нужно создавать объект класса для доступа к статической функции. Вместо этого вы можете использовать оператор разрешения имени класса и области видимости. (::).

Синтаксис:

className::funcName

Выше className — это имя класса, в котором определена статическая функция. FuncName — это имя, присвоенное статической функции.

Пример 2

#include<iostream> 
using namespace std;
class MyClass {
public:
	static void msgFunc() {
		cout << "Welcome to Guru99!";
	}
};
int main() {
	MyClass::msgFunc();
}

Вывод:

Доступ к статическим функциям

Вот скриншот кода:

Доступ к статическим функциям

Пояснение к коду:

  1. Включение заголовочного файла iostream в нашу программу для использования его функций.
  2. Включите пространство имен std в свой код, чтобы использовать его классы без его вызова.
  3. Создайте класс с именем MyClass.
  4. Используйте модификатор публичного доступа, чтобы пометить член класса как общедоступный.
  5. Объявление статической функции с именем msgFunc(). Ключевое слово static делает функцию статической.
  6. Укажите текст, который будет печататься на консоли после вызова/вызова вышеуказанной функции.
  7. Конец тела функции msgFunc().
  8. Завершите тело класса.
  9. Вызов функции main().
  10. Вызовите статическую функцию с именем msgFunc().
  11. Конец тела функции main().

Доступ к статическим переменным

Статические переменные принадлежат классу, а не объектам класса. Если статическая переменная является общедоступной, она доступна по имени класса и оператору разрешения области. Однако это невозможно, если статический член является закрытым.

Обычно доступ к частным переменным осуществляется с помощью общедоступных функций. Однако необходимо создать экземпляр/объект класса. Решение состоит в использовании статической функции.

Пример 3. Статическая переменная в классе C++

#include<iostream> 
using namespace std;
class AClass {
private:
	static int myvar;
public:
	static int getVar() { 
		return myvar; 
		} 
};
int AClass::myvar = 23; 
int main() {
	cout <<"The value of myvar is: "<< AClass::getVar() << '\n';
}

Вывод:

Доступ к статическим переменным

Вот скриншот кода:

Доступ к статическим переменным

Пояснение к коду:

  1. Включаем заголовочный файл iostream в нашу программу.
  2. Включите пространство имен std в эту программу, чтобы использовать ее классы без вызова.
  3. Создайте класс с именем AClass.
  4. Используйте модификатор частного доступа, чтобы сделать переменную myvar частной доступной.
  5. Создайте статическую целочисленную переменную с именем myvar.
  6. Используйте модификатор публичного доступа, который помечает функцию getVar() как общедоступную.
  7. Создание статической функции с именем getVar().
  8. Функция getVar() должна возвращать значение переменной myvar.
  9. Конец тела функции getVar().
  10. Конец тела класса AClass.
  11. Присвойте переменной myvar значение 23. Для этого мы использовали оператор разрешения имени класса и области видимости.
  12. Вызов функции main().
  13. Выведите значение переменной myVar на консоль вместе с другим текстом. Мы использовали имя класса, статическую функцию и оператор разрешения области для доступа к значению этой переменной.
  14. Конец тела функции main().

этот указатель в статических функциях

Статическая функция не привязана к объекту. Вот почему статические функции не имеют этого указателя. Указатель объекта обычно указывает на объект, над которым он в данный момент работает. Поскольку статические функции не работают с объектами, в этом указателе нет необходимости.

Статические функции имеют прямой доступ к другим статическим членам. Однако это не относится к нестатическим членам. Причина в том, что нестатические члены должны принадлежать объекту, а у статических функций нет объектов для работы.

Пример 4

Можно определить статическую функцию вне объявления класса. Давайте продемонстрируем это:

#include<iostream> 
using namespace std;
class NumGenerator {
private:
	static int nextNum; 
public:
	static int getNextNum();
};
int NumGenerator::nextNum = 1;
int NumGenerator::getNextNum() {
	return nextNum++; 
}
int main() {
	for (int count = 0; count < 5; ++count)
		std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n';
	return 0;
}

Вывод:

этот указатель в статических функциях

Вот скриншот вашего кода:

этот указатель в статических функциях

Пояснение к коду:

  1. Включение заголовочного файла iostream в наш код для использования его функций.
  2. Включите пространство имен std в наш код, чтобы использовать его классы, не вызывая его.
  3. Создайте класс с именем NumGenerator.
  4. Используя модификатор частного доступа, чтобы пометить переменную, мы собираемся создать ее как частно доступную.
  5. Создайте статическую целочисленную переменную с именем nextNum.
  6. Использование модификатора публичного доступа, который поможет вам пометить переменную, которую мы собираемся создать, как общедоступную.
  7. Объявление статической функции с именем getNextNum().
  8. Конец тела класса.
  9. Присвойте переменной nextNum значение 1. Мы сделали это, используя имя класса, имя переменной и оператор разрешения области.
  10. Определение статической функции getNextNum() вне класса.
  11. Укажите действие, которое должно быть выполнено при вызове вышеуказанной функции. Это увеличит значение переменной nextNum на 1.
  12. Конец определения функции getNextNum().
  13. Вызов функции main(). Логику программы C++ следует добавить в тело этой функции.
  14. Использовать для цикла чтобы создать переменную с именем count. Значение этой переменной должно увеличиваться от 0 до 4. После каждой итерации значение переменной будет увеличиваться на 1.
  15. Печать значения переменной nextNum вместе с другим текстом на консоли на каждой итерации. Доступ к значению осуществляется с помощью функции getNextNum().
  16. Эта программа C++ должна возвращать значение после успешного завершения.
  17. Конец функции main().

Итоги

  • Статические члены C++ — это члены класса, принадлежащие классу, а не его объектам.
  • У вас будет только одна копия статического члена независимо от количества создаваемых вами объектов.
  • Все объекты класса совместно используют каждого статического члена класса.
  • После определения функции класса как статической она становится независимой от объектов класса.
  • Доступ к статической функции возможен, даже если вы не создаете какой-либо объект класса.
  • Однако статические функции не имеют этого объекта, который указывает на объекты класса.