Statisk medlemsfunktion i C++ (Eksempler)

Hvad er en statisk funktion i C++?

In C++ klasser, er et statisk medlem et klassemedlem, der tilhรธrer klassen snarere end til dens objekter. Du vil kun have รฉn kopi af medlemskabet. Dette er tilfรฆldet uanset antallet af objekter, du opretter.

Nรฅr en klassefunktion er defineret som statisk, deler alle klasseobjekter et statisk klassemedlem. Den statiske funktion kan derfor tilgรฅs uden at oprette nogen klasseobjekter og bliver uafhรฆngig af klasseobjekter. Et statisk datamedlem i C++ kan fรฅ adgang til andre statiske funktioner, kun uden for klassen.

Hvorfor bruge statiske funktioner?

I modsรฆtning til C++ globale funktioner, statiske funktioner er kun tilgรฆngelige fra deklarationsfilen. Hvis der er behov for at begrรฆnse adgangen til en funktion, sรฅ gรธr den statisk.

Brug en statisk funktion til at begrรฆnse genbrugen af โ€‹โ€‹det samme funktionsnavn i en anden fil.

Definering af statiske funktioner i C++

Syntaks:

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

I ovenstรฅende eksempel definerer vi en statisk funktion ved navn myfunc. Lรฆg mรฆrke til brugen af โ€‹โ€‹det statiske nรธgleord i definitionen. Nรธgleordet kommer fรธr funktionsnavnet.

Statisk medlemsfunktion i C++

Nรฅr et funktionsmedlem erklรฆres statisk, bliver det uafhรฆngigt af andre objekter i klassen. Du kan kalde en statisk medlemsfunktion, selvom der ikke findes andre klasseobjekter.

For at fรฅ adgang til klassenavne skal du bruge navnet pรฅ klassen og scope resolution operatoren (::). En statisk funktion kan kun fรฅ adgang til andre statiske funktioner, statiske datamedlemmer og andre funktioner uden for klassen. Omfanget af statiske medlemsfunktioner ligger inden for klassen, og de kan ikke fรฅ adgang til denne klassemarkรธr.

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

Output:

Statisk medlemsfunktion

Her er et skรฆrmbillede af koden:

Statisk medlemsfunktion

Kodeforklaring:

  1. Inklusive iostream header-filen i vores C++ program til at bruge det funktioner.
  2. Inkluder std-navneomrรฅdet i koden for at bruge dets klasser uden at kalde det.
  3. Opret en klasse med navnet BoxKlasse.
  4. Brug offentlig adgangsmodifikator til at markere et klassemedlem, som er offentligt tilgรฆngeligt.
  5. Den erklรฆrer et statisk klassemedlem ved navn tรฆller.
  6. Brug en klassekonstruktor til at initialisere tre variable af dobbelt type.
  7. Udskriv noget tekst pรฅ konsollen. Endl-funktionen (slutlinje) flytter musemarkรธren til nรฆste linje.
  8. Initialiser vรฆrdien af โ€‹โ€‹l til variabel lรฆngde.
  9. Initialiser vรฆrdien af โ€‹โ€‹b til variabel bredde.
  10. Initialiser vรฆrdien af โ€‹โ€‹h til variabel hรธjde.
  11. Forรธg derefter vรฆrdien af โ€‹โ€‹det variable antal med 1, hver gang et nyt objekt oprettes.
  12. Slut pรฅ konstruktรธrlegemet.
  13. Opret en funktion ved navn doublevolume().
  14. Definer, hvad doubleVolume()-funktionen skal returnere. Det skal returnere multiplikationen af โ€‹โ€‹lรฆngde-, bredde- og hรธjdevariabler.
  15. Slutningen af โ€‹โ€‹doubleVolume() funktionsteksten.
  16. Erklรฆr en statisk funktion ved navn getCount().
  17. GetCount()-funktionen skal returnere vรฆrdien af โ€‹โ€‹count-variablen.
  18. Slut pรฅ kroppen af โ€‹โ€‹getCount()-funktionen.
  19. Brug den private adgangsmodifikator til at markere et klassemedlem som offentligt tilgรฆngeligt.
  20. Erklรฆring af et klassemedlem med navnet lรฆngde af en dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
  21. Erklรฆre et andet klassemedlem ved navn bredden af โ€‹โ€‹en dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
  22. Erklรฆring af et klassemedlem ved navn hรธjde af dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
  23. Slutningen af โ€‹โ€‹kroppen af BoxKlasse klasse.
  24. Initialiser derefter et statisk medlem af BoxKlasse klasse.
  25. Kalder hoved()-funktionen. De C++ programlogik skal tilfรธjes i kroppen af โ€‹โ€‹denne funktion.
  26. Udskriv noget tekst pรฅ konsollen med angivelse af det aktuelle antal objekter, fรธr nye objekter oprettes.
  27. Erklรฆre et objekt navngivet Box1, som er en af โ€‹โ€‹forekomsterne af klassen Boxklasse. Vรฆrdierne for bredde, lรฆngde og hรธjde skal angives i parentesen.
  28. Erklรฆre et objekt navngivet Box2, som er en forekomst af klassen Boxklasse. Vรฆrdierne for bredde, lรฆngde og hรธjde er angivet i parentesen.
  29. Udskriv noget tekst pรฅ konsollen med angivelse af det aktuelle antal objekter efter oprettelsen af โ€‹โ€‹nye objekter.
  30. C++ program skal returnere vรฆrdi ved vellykket gennemfรธrelse.
  31. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktion main().

Adgang til statiske funktioner

Du behรธver ikke oprette et klasseobjekt for at fรฅ adgang til en statisk funktion. I stedet kan du bruge klassenavnet og scope resolution operatoren (::).

Syntaks:

className::funcName

Ovenfor er className navnet pรฅ den klasse, hvor den statiske funktion er blevet defineret. FuncName er det navn, der er tildelt den statiske funktion.

Eksempel 2

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

Output:

Adgang til statiske funktioner

Her er et skรฆrmbillede af koden:

Adgang til statiske funktioner

Kodeforklaring:

  1. Inkluderer iostream header-filen i vores program for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i din kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn MyClass.
  4. Brug offentlig adgangsmodifikator til at markere et klassemedlem som offentligt tilgรฆngeligt.
  5. Erklรฆrer en statisk funktion ved navn msgFunc(). Det statiske nรธgleord gรธr funktionen statisk.
  6. Angiv den tekst, der skal udskrives pรฅ konsollen, nรฅr ovenstรฅende funktion kaldes/kaldes.
  7. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹msgFunc()-funktionen.
  8. Afslut klassens krop.
  9. Kalder hoved()-funktionen.
  10. Kald den statiske funktion ved navn msgFunc().
  11. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktion main().

Adgang til statiske variabler

Statiske variabler tilhรธrer en klasse snarere end til klasseobjekter. Hvis en statisk variabel er offentlig, er den tilgรฆngelig ved hjรฆlp af klassenavnet og ved hjรฆlp af scope resolution-operatoren. Dette er dog ikke muligt, hvis et statisk medlem er privat.

Normalt tilgรฅs private variabler ved hjรฆlp af offentlige funktioner. Der skal dog oprettes en klasseinstans/objekt. Lรธsningen er at bruge en statisk funktion.

Eksempel 3: Statisk variabel i C++ klasse

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

Output:

Adgang til statiske variabler

Her er et skรฆrmbillede af koden:

Adgang til statiske variabler

Kodeforklaring:

  1. Inklusive iostream header-filen i vores program.
  2. Inkluder std-navneomrรฅdet i dette program for at bruge dets klasser uden at kalde.
  3. Opret en klasse ved navn AClass.
  4. Brug modifikatoren for privat adgang til at gรธre variablen myvar privat tilgรฆngelig.
  5. Opret en statisk heltalsvariabel ved navn myvar.
  6. Brug public access modifier, som markerer funktionen getVar() som offentligt tilgรฆngelig.
  7. Oprettelse af en statisk funktion ved navn getVar().
  8. GetVar()-funktionen skulle vรฆre i stand til at returnere vรฆrdien af โ€‹โ€‹variablen myvar.
  9. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹funktionen getVar().
  10. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹klassen AKlasse.
  11. Tildel variablen myvar en vรฆrdi pรฅ 23. Vi har brugt klassens navn og scope resolution operator til dette.
  12. Kalder hoved()-funktionen.
  13. Udskriv vรฆrdien af โ€‹โ€‹variabel myVar pรฅ konsollen sammen med anden tekst. Vi har brugt klassenavnet, den statiske funktion og scope resolution operatoren til at fรฅ adgang til denne variabels vรฆrdi.
  14. Slutningen af โ€‹โ€‹hoved()-funktionsteksten.

denne pointer i statiske funktioner

En statisk funktion er ikke knyttet til et objekt. Det er derfor, statiske funktioner ikke har denne pointer. Et objekts markรธr peger normalt pรฅ det objekt, det arbejder pรฅ i รธjeblikket. Da statiske funktioner ikke virker med objekter, er der ikke behov for denne markรธr.

Statiske funktioner har direkte adgang til andre statiske medlemmer. Dette er dog ikke tilfรฆldet med ikke-statiske medlemmer. ร…rsagen er, at ikke-statiske medlemmer skal tilhรธre et objekt, men statiske funktioner har ikke objekter at arbejde med.

Eksempel 4

Det er muligt at definere en statisk funktion uden for klasseerklรฆringen. Lad os demonstrere dette:

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

Output:

denne pointer i statiske funktioner

Her er et skรฆrmbillede af din kode:

denne pointer i statiske funktioner

Kodeforklaring:

  1. Inkluderer iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn NumGenerator.
  4. Ved at bruge modifikatoren for privat adgang til at markere variablen er vi ved at oprette som privat tilgรฆngelig.
  5. Opret en statisk heltalsvariabel ved navn nextNum.
  6. Brug af offentlig adgangsmodifikator, der hjรฆlper dig med at markere den variabel, vi er ved at oprette, som offentligt tilgรฆngelig.
  7. Erklรฆrer en statisk funktion ved navn getNextNum().
  8. Slutningen af โ€‹โ€‹klassens krop.
  9. Tildel variablen nextNum en vรฆrdi pรฅ 1. Vi har gjort dette ved at bruge klassenavnet, variabelnavnet og scope-oplรธsningsoperatoren.
  10. Definerer den statiske getNextNum() funktion uden for klassen.
  11. Angiv den handling, der skal udfรธres, nรฅr ovenstรฅende funktion kaldes/pรฅkaldes. Det vil รธge vรฆrdien af โ€‹โ€‹variabel nextNum med 1.
  12. Slut pรฅ definition af funktionen getNextNum().
  13. Kalder hoved()-funktionen. De C++ programlogik skal tilfรธjes i denne funktions brรธdtekst.
  14. Brug til lรธkke for at oprette en variabel med navnet count. Vรฆrdien af โ€‹โ€‹denne variabel bรธr stige fra 0 til 4. Efter hver iteration vil variablens vรฆrdi stige med 1.
  15. Udskrivning af vรฆrdien af โ€‹โ€‹variabel nextNum sammen med anden tekst pรฅ konsollen ved hver iteration. Vรฆrdien tilgรฅs ved hjรฆlp af getNextNum()-funktionen.
  16. Denne C++ programmet skal returnere vรฆrdi efter vellykket afslutning.
  17. Slut pรฅ main()-funktionen.

Resumรฉ

  • C++ statiske medlemmer er klassemedlemmer, der tilhรธrer klassen i stedet for dens objekter.
  • Du vil kun have รฉn kopi af et statisk medlem uanset antallet af objekter, du opretter.
  • Alle klasseobjekter deler hvert statisk klassemedlem.
  • Efter at have defineret en klassefunktion som statisk, bliver den uafhรฆngig af klasseobjekterne.
  • En statisk funktion kan tilgรฅs, selvom du ikke opretter noget klasseobjekt.
  • Statiske funktioner har dog ikke dette objekt, som peger pรฅ klasseobjekter.

Opsummer dette indlรฆg med: