Statisk medlemsfunktion i C++ (Exempel)

Vad รคr en statisk funktion i C++?

In C++ klasser, รคr en statisk medlem en klassmedlem som tillhรถr klassen snarare รคn dess objekt. Du kommer bara att ha ett exemplar av medlemskapet. Detta รคr fallet oavsett antalet objekt du skapar.

Nรคr en klassfunktion definieras som statisk delar alla klassobjekt en statisk klassmedlem. Den statiska funktionen kan dรคrfรถr nรฅs utan att skapa nรฅgra klassobjekt och blir oberoende av klassobjekt. En statisk datamedlem i C++ kan komma รฅt andra statiska funktioner, endast utanfรถr klassen.

Varfรถr anvรคnda statiska funktioner?

Till skillnad frรฅn C++ globala funktioner, statiska funktioner รคr endast tillgรคngliga frรฅn deklarationsfilen. Om det finns ett behov av att begrรคnsa รฅtkomsten till en funktion, gรถr den statisk.

Anvรคnd en statisk funktion fรถr att begrรคnsa รฅteranvรคndningen av samma funktionsnamn i en annan fil.

Definiera statiska funktioner i C++

Syntax:

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

I exemplet ovan definierar vi en statisk funktion som heter myfunc. Lรคgg mรคrke till anvรคndningen av det statiska nyckelordet i definitionen. Nyckelordet kommer fรถre funktionsnamnet.

Statisk medlemsfunktion i C++

Nรคr en funktionsmedlem deklareras statisk blir den oberoende av andra objekt i klassen. Du kan anropa en statisk medlemsfunktion รคven om det inte finns nรฅgra andra klassobjekt.

Fรถr att komma รฅt klassnamn bรถr du anvรคnda klassens namn och scope resolution operator (::). En statisk funktion kan bara komma รฅt andra statiska funktioner, statiska datamedlemmar och andra funktioner utanfรถr klassen. Omfattningen av statiska medlemsfunktioner ligger inom klassen, och de kan inte komma รฅt denna klasspekare.

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

Produktion:

Statisk medlemsfunktion

Hรคr รคr en skรคrmdump av koden:

Statisk medlemsfunktion

Kodfรถrklaring:

  1. Inklusive iostream-huvudfilen i vรฅr C++ program fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i koden fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass med namnet BoxKlass.
  4. Anvรคnd public access modifier fรถr att markera en klassmedlem som รคr allmรคnt tillgรคnglig.
  5. Deklarerar en statisk klassmedlem som heter count.
  6. Anvรคnd en klasskonstruktรถr fรถr att initiera tre variabler av dubbel typ.
  7. Skriv ut lite text pรฅ konsolen. Endl-funktionen (slutlinje) flyttar muspekaren till nรคsta rad.
  8. Initiera vรคrdet pรฅ l till variabel lรคngd.
  9. Initiera vรคrdet av b till variabel bredd.
  10. Initiera vรคrdet av h till variabel hรถjd.
  11. ร–ka sedan vรคrdet pรฅ variabelantalet med 1 varje gรฅng ett nytt objekt skapas.
  12. Slutet pรฅ konstruktorkroppen.
  13. Skapa en funktion som heter doublevolume().
  14. Definiera vad funktionen doubleVolume() ska returnera. Den ska returnera multiplikationen av variabler fรถr lรคngd, bredd och hรถjd.
  15. Slutet pรฅ doubleVolume()-funktionskroppen.
  16. Deklarera en statisk funktion som heter getCount().
  17. Funktionen getCount() ska returnera vรคrdet pรฅ count-variabeln.
  18. Slutet pรฅ kroppen fรถr getCount()-funktionen.
  19. Anvรคnd modifieraren fรถr privat รฅtkomst fรถr att markera en klassmedlem som allmรคnt tillgรคnglig.
  20. Deklarera en klassmedlem med namnet lรคngd av en dubbel datatyp. Det kommer att vara privat tillgรคngligt.
  21. Deklarera en annan klassmedlem med namnet bredd av en dubbel datatyp. Det kommer att vara privat tillgรคngligt.
  22. Deklarera en klassmedlem som heter hรถjd av dubbel datatyp. Det kommer att vara privat tillgรคngligt.
  23. Slutet av kroppen av BoxKlassklass.
  24. Initiera sedan en statisk medlem av BoxKlassklass.
  25. Anropar funktionen main(). De C++ programlogik bรถr lรคggas till i kroppen av den funktionen.
  26. Skriv ut lite text pรฅ konsolen med aktuellt antal objekt innan nya objekt skapas.
  27. Deklarera ett objekt som heter Box1, som รคr en av fรถrekomsterna av klassen BoxKlass. Vรคrdena fรถr bredd, lรคngd och hรถjd ska anges inom parentes.
  28. Deklarera ett objekt som heter Box2, som รคr en instans av klassen BoxKlass. Vรคrdena fรถr bredd, lรคngd och hรถjd har specificerats inom parentes.
  29. Skriv ut lite text pรฅ konsolen som anger det aktuella antalet objekt efter att nya objekt skapats.
  30. Ocuco-landskapet C++ program mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  31. Slutet pรฅ huvuddelen av funktion main().

ร…tkomst till statiska funktioner

Du behรถver inte skapa ett klassobjekt fรถr att komma รฅt en statisk funktion. Istรคllet kan du anvรคnda klassnamnet och scope resolution operator (::).

Syntax:

className::funcName

Ovan รคr className namnet pรฅ klassen dรคr den statiska funktionen har definierats. FuncName รคr namnet som tilldelats den statiska funktionen.

Exempelvis 2

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

Produktion:

ร…tkomst till statiska funktioner

Hรคr รคr en skรคrmdump av koden:

ร…tkomst till statiska funktioner

Kodfรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅrt program fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnutrymmet i din kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass som heter MyClass.
  4. Anvรคnd public access modifier fรถr att markera en klassmedlem som allmรคnt tillgรคnglig.
  5. Deklarerar en statisk funktion som heter msgFunc(). Nyckelordet static gรถr funktionen statisk.
  6. Ange texten som ska skrivas ut pรฅ konsolen nรคr ovanstรฅende funktion anropas/anropas.
  7. Slutet pรฅ brรถdtexten fรถr msgFunc()-funktionen.
  8. Avsluta klasskroppen.
  9. Anropar funktionen main().
  10. Anropa den statiska funktionen som heter msgFunc().
  11. Slutet pรฅ huvuddelen av funktion main().

ร…tkomst till statiska variabler

Statiska variabler tillhรถr en klass snarare รคn till klassobjekt. Om en statisk variabel รคr offentlig รคr den tillgรคnglig med klassnamnet och med scope resolution-operatorn. Detta รคr dock inte mรถjligt om en statisk medlem รคr privat.

Normalt nรฅs privata variabler med hjรคlp av offentliga funktioner. En klassinstans/objekt mรฅste dock skapas. Lรถsningen รคr att anvรคnda en statisk funktion.

Exempel 3: Statisk variabel i C++ klass

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

Produktion:

ร…tkomst till statiska variabler

Hรคr รคr en skรคrmdump av koden:

ร…tkomst till statiska variabler

Kodfรถrklaring:

  1. Inklusive iostream-huvudfilen i vรฅrt program.
  2. Inkludera std-namnomrรฅdet i det hรคr programmet fรถr att anvรคnda dess klasser utan att anropa.
  3. Skapa en klass som heter AClass.
  4. Anvรคnd modifieraren fรถr privat รฅtkomst fรถr att gรถra variabeln myvar privat tillgรคnglig.
  5. Skapa en statisk heltalsvariabel med namnet myvar.
  6. Anvรคnd public access-modifieraren som markerar funktionen getVar() som allmรคnt tillgรคnglig.
  7. Skapa en statisk funktion med namnet getVar().
  8. Funktionen getVar() ska kunna returnera vรคrdet fรถr variabeln myvar.
  9. Slutet pรฅ kroppen av funktionen getVar().
  10. Slutet pรฅ kroppen av klassen AClass.
  11. Tilldela variabeln myvar vรคrdet 23. Vi har anvรคnt klassens namn och scope resolution operator fรถr detta.
  12. Anropar funktionen main().
  13. Skriv ut vรคrdet fรถr variabeln myVar pรฅ konsolen tillsammans med annan text. Vi har anvรคnt klassnamnet, den statiska funktionen och scope resolution operatorn fรถr att komma รฅt denna variabels vรคrde.
  14. Slutet pรฅ huvuddelen av huvud()-funktionen.

denna pekare i statiska funktioner

En statisk funktion รคr inte kopplad till ett objekt. Det รคr dรคrfรถr statiska funktioner inte har denna pekare. Ett objekts pekare pekar vanligtvis pรฅ objektet som det fรถr nรคrvarande arbetar med. Eftersom statiska funktioner inte fungerar med objekt finns det inget behov av denna pekare.

Statiska funktioner har direkt tillgรฅng till andra statiska medlemmar. Detta รคr dock inte fallet med icke-statiska medlemmar. Anledningen รคr att icke-statiska medlemmar mรฅste tillhรถra ett objekt, men statiska funktioner har inga objekt att arbeta med.

Exempelvis 4

Det รคr mรถjligt att definiera en statisk funktion utanfรถr klassdeklarationen. Lรฅt oss demonstrera detta:

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

Produktion:

denna pekare i statiska funktioner

Hรคr รคr en skรคrmdump av din kod:

denna pekare i statiska funktioner

Kodfรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass som heter NumGenerator.
  4. Genom att anvรคnda modifieraren fรถr privat รฅtkomst fรถr att markera variabeln รคr vi pรฅ vรคg att skapa som privatรฅtkomliga.
  5. Skapa en statisk heltalsvariabel med namnet nextNum.
  6. Genom att anvรคnda public access-modifieraren som hjรคlper dig att markera variabeln vi hรฅller pรฅ att skapa som allmรคnt tillgรคnglig.
  7. Deklarera en statisk funktion som heter getNextNum().
  8. Slutet av klassens kropp.
  9. Tilldela variabeln nextNum vรคrdet 1. Vi har gjort detta med hjรคlp av klassnamnet, variabelnamnet och scope resolution operator.
  10. Definiera den statiska funktionen getNextNum() utanfรถr klassen.
  11. Ange vilken รฅtgรคrd som ska vidtas nรคr ovanstรฅende funktion anropas/anropas. Det kommer att รถka vรคrdet pรฅ variabeln nextNum med 1.
  12. Slutet pรฅ definitionen av funktionen getNextNum().
  13. Anropar funktionen main(). De C++ programlogik bรถr lรคggas till i kroppen av denna funktion.
  14. Anvรคnd fรถr slinga fรถr att skapa en variabel med namnet count. Vรคrdet pรฅ denna variabel bรถr รถka frรฅn 0 till 4. Efter varje iteration kommer variabelns vรคrde att รถka med 1.
  15. Skriver ut vรคrdet fรถr variabeln nextNum tillsammans med annan text pรฅ konsolen vid varje iteration. Vรคrdet nรฅs med funktionen getNextNum() .
  16. Detta C++ programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  17. Slutet pรฅ main()-funktionen.

Sammanfattning

  • C++ statiska medlemmar รคr klassmedlemmar som tillhรถr klassen snarare รคn dess objekt.
  • Du kommer bara att ha en kopia av en statisk medlem oavsett antalet objekt du skapar.
  • Alla klassobjekt delar varje statisk klassmedlem.
  • Efter att ha definierat en klassfunktion som statisk, blir den oberoende av klassobjekten.
  • En statisk funktion kan nรฅs รคven om du inte skapar nรฅgot klassobjekt.
  • Statiska funktioner har dock inte detta objekt, vilket pekar pรฅ klassobjekt.

Sammanfatta detta inlรคgg med: