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

⚡ Умное резюме

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

  • 📌 Определение: Статический член принадлежит самому классу, поэтому существует одна общая копия независимо от того, сколько объектов создано.
  • 🔁 Общее состояние: Каждый объект обращается к одному и тому же статическому члену данных, что делает его идеальным для счетчиков, используемых в масштабе всего класса, или для общей конфигурации.
  • 🚪 Предметы не требуются: Статические функции-члены вызываются с использованием имени класса и оператора разрешения области видимости, без создания какого-либо объекта.
  • ???? Пределы доступа: Статическая функция не может использовать указатель `this` и может обращаться только к статическим членам, а не к данным, специфичным для экземпляра.
  • 🧩 Синтаксический шаблон: Объявите функцию с помощью ключевого слова `static` внутри класса, а определите её вне класса, используя `ClassName::functionName`.

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

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

In 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;
}

Выход:

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

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

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

Code Объяснение:

  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. Создайте функцию с именем doublevolume().
  14. Определите, что будет возвращать функция doubleVolume(). Он должен возвращать произведение переменных длины, ширины и высоты.
  15. Конец тела функции doubleVolume().
  16. Объявите статическую функцию с именем getCount().
  17. Функция getCount() должна возвращать значение переменной count.
  18. Конец тела функции getCount().
  19. Используйте модификатор частного доступа, чтобы пометить члена класса как общедоступного.
  20. Объявление члена класса с именем length типа данных double. Доступ будет в частном порядке.
  21. Объявите еще один член класса с именем width типа данных double. Доступ будет в частном порядке.
  22. Объявление члена класса с именем height типа данных 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();
}

Выход:

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

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

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

Code Объяснение:

  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';
}

Выход:

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

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

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

Code Объяснение:

  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().

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

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

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

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

Пример 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;
}

Выход:

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

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

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

Code Объяснение:

  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().

Часто задаваемые вопросы (FAQ)

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

Статическая переменная-член хранит одно общее значение для всех объектов, в то время как статическая функция-член работает с этими общими переменными без необходимости создания экземпляра объекта.

Статические функции не привязаны к какому-либо объекту, поэтому указатель `this` не существует. Они работают на уровне класса и, следовательно, не могут получить доступ к нестатическим членам.

Вызовите функцию, используя имя класса и оператор разрешения области видимости, например ClassName::function(), без создания какого-либо объекта класса.

Нет. Статическая функция-член может обращаться только к статическим членам данных и другим статическим функциям, поскольку у неё нет контекста объекта для доступа к данным экземпляра.

Искусственный интеллект, используемый в таких сервисах, как GitHub Copilot, предлагает сигнатуры статических методов, генерирует шаблонный код, указывает на неправильное использование указателей this и объясняет, когда функция уровня класса лучше подходит для данной архитектуры, чем метод экземпляра.

Да. Линтеры и IDE, использующие искусственный интеллект, обнаруживают несанкционированный доступ к нестатическим членам, отсутствие определений вне класса и ошибки инициализации статических переменных до того, как компиляция завершится с ошибкой.

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

Подведем итог этой публикации следующим образом: