Статична членска функция в 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. Използвайте конструктор на клас, за да инициализирате три променливи от двоен тип.
  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 от двоен тип данни. Ще бъде частно достъпен.
  21. Декларирайте друг член на класа, наречен ширина на двоен тип данни. Ще бъде частно достъпен.
  22. Деклариране на член на класа с име height от двоен тип данни. Ще бъде частно достъпен.
  23. Краят на тялото на Boxклас клас.
  24. След това инициализирайте статичен член на Boxклас клас.
  25. Извикване на функцията main(). The 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(). The C++ програмната логика трябва да се добави в тялото на тази функция.
  14. Употреба за цикъл за да създадете променлива с име count. Стойността на тази променлива трябва да нараства от 0 до 4. След всяка итерация стойността на променливата ще се увеличава с 1.
  15. Отпечатване на стойността на променливата nextNum заедно с друг текст на конзолата при всяка итерация. Достъпът до стойността се осъществява чрез функцията getNextNum().
  16. Това C++ програмата трябва да върне стойност при успешно завършване.
  17. Край на функцията main().

Въпроси и Отговори

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

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

Статичните функции не са обвързани с никакъв обект, така че не съществува указател this. Те работят на ниво клас и следователно не могат да имат достъп до нестатични членове.

Извикайте го, използвайки името на класа и оператора за разрешаване на обхвата, например ClassName::function(), без да създавате обект на класа.

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

Асистенти с изкуствен интелект, като GitHub Copilot, предлагат статични сигнатури на методи, генерират шаблони, сигнализират за злоупотреба с този указател и обясняват кога функция на ниво клас е по-подходяща за дизайна от метод на инстанция.

Да. Линтери и IDE, задвижвани от изкуствен интелект, откриват незаконен достъп до нестатични членове, липсващи дефиниции извън класа и грешки при инициализация на статични променливи, преди компилацията да се провали.

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

Обобщете тази публикация с: