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:
Her er et skรฆrmbillede af koden:
Kodeforklaring:
- Inklusive iostream header-filen i vores C++ program til at bruge det funktioner.
- Inkluder std-navneomrรฅdet i koden for at bruge dets klasser uden at kalde det.
- Opret en klasse med navnet BoxKlasse.
- Brug offentlig adgangsmodifikator til at markere et klassemedlem, som er offentligt tilgรฆngeligt.
- Den erklรฆrer et statisk klassemedlem ved navn tรฆller.
- Brug en klassekonstruktor til at initialisere tre variable af dobbelt type.
- Udskriv noget tekst pรฅ konsollen. Endl-funktionen (slutlinje) flytter musemarkรธren til nรฆste linje.
- Initialiser vรฆrdien af โโl til variabel lรฆngde.
- Initialiser vรฆrdien af โโb til variabel bredde.
- Initialiser vรฆrdien af โโh til variabel hรธjde.
- Forรธg derefter vรฆrdien af โโdet variable antal med 1, hver gang et nyt objekt oprettes.
- Slut pรฅ konstruktรธrlegemet.
- Opret en funktion ved navn doublevolume().
- Definer, hvad doubleVolume()-funktionen skal returnere. Det skal returnere multiplikationen af โโlรฆngde-, bredde- og hรธjdevariabler.
- Slutningen af โโdoubleVolume() funktionsteksten.
- Erklรฆr en statisk funktion ved navn getCount().
- GetCount()-funktionen skal returnere vรฆrdien af โโcount-variablen.
- Slut pรฅ kroppen af โโgetCount()-funktionen.
- Brug den private adgangsmodifikator til at markere et klassemedlem som offentligt tilgรฆngeligt.
- Erklรฆring af et klassemedlem med navnet lรฆngde af en dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
- Erklรฆre et andet klassemedlem ved navn bredden af โโen dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
- Erklรฆring af et klassemedlem ved navn hรธjde af dobbelt datatype. Det vil vรฆre privat tilgรฆngeligt.
- Slutningen af โโkroppen af BoxKlasse klasse.
- Initialiser derefter et statisk medlem af BoxKlasse klasse.
- Kalder hoved()-funktionen. De C++ programlogik skal tilfรธjes i kroppen af โโdenne funktion.
- Udskriv noget tekst pรฅ konsollen med angivelse af det aktuelle antal objekter, fรธr nye objekter oprettes.
- 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.
- 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.
- Udskriv noget tekst pรฅ konsollen med angivelse af det aktuelle antal objekter efter oprettelsen af โโnye objekter.
- C++ program skal returnere vรฆrdi ved vellykket gennemfรธrelse.
- 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:
Her er et skรฆrmbillede af koden:
Kodeforklaring:
- Inkluderer iostream header-filen i vores program for at bruge dens funktioner.
- Inkluder std-navneomrรฅdet i din kode for at bruge dets klasser uden at kalde det.
- Opret en klasse ved navn MyClass.
- Brug offentlig adgangsmodifikator til at markere et klassemedlem som offentligt tilgรฆngeligt.
- Erklรฆrer en statisk funktion ved navn msgFunc(). Det statiske nรธgleord gรธr funktionen statisk.
- Angiv den tekst, der skal udskrives pรฅ konsollen, nรฅr ovenstรฅende funktion kaldes/kaldes.
- Slutningen af โโbrรธdteksten af โโmsgFunc()-funktionen.
- Afslut klassens krop.
- Kalder hoved()-funktionen.
- Kald den statiske funktion ved navn msgFunc().
- 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:
Her er et skรฆrmbillede af koden:
Kodeforklaring:
- Inklusive iostream header-filen i vores program.
- Inkluder std-navneomrรฅdet i dette program for at bruge dets klasser uden at kalde.
- Opret en klasse ved navn AClass.
- Brug modifikatoren for privat adgang til at gรธre variablen myvar privat tilgรฆngelig.
- Opret en statisk heltalsvariabel ved navn myvar.
- Brug public access modifier, som markerer funktionen getVar() som offentligt tilgรฆngelig.
- Oprettelse af en statisk funktion ved navn getVar().
- GetVar()-funktionen skulle vรฆre i stand til at returnere vรฆrdien af โโvariablen myvar.
- Slutningen af โโkroppen af โโfunktionen getVar().
- Slutningen af โโkroppen af โโklassen AKlasse.
- Tildel variablen myvar en vรฆrdi pรฅ 23. Vi har brugt klassens navn og scope resolution operator til dette.
- Kalder hoved()-funktionen.
- 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.
- 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:
Her er et skรฆrmbillede af din kode:
Kodeforklaring:
- Inkluderer iostream-headerfilen i vores kode for at bruge dens funktioner.
- Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
- Opret en klasse ved navn NumGenerator.
- Ved at bruge modifikatoren for privat adgang til at markere variablen er vi ved at oprette som privat tilgรฆngelig.
- Opret en statisk heltalsvariabel ved navn nextNum.
- Brug af offentlig adgangsmodifikator, der hjรฆlper dig med at markere den variabel, vi er ved at oprette, som offentligt tilgรฆngelig.
- Erklรฆrer en statisk funktion ved navn getNextNum().
- Slutningen af โโklassens krop.
- Tildel variablen nextNum en vรฆrdi pรฅ 1. Vi har gjort dette ved at bruge klassenavnet, variabelnavnet og scope-oplรธsningsoperatoren.
- Definerer den statiske getNextNum() funktion uden for klassen.
- 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.
- Slut pรฅ definition af funktionen getNextNum().
- Kalder hoved()-funktionen. De C++ programlogik skal tilfรธjes i denne funktions brรธdtekst.
- 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.
- 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.
- Denne C++ programmet skal returnere vรฆrdi efter vellykket afslutning.
- 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.






