Statisk medlemsfunktion i C++ (Exempel)

โšก Smart sammanfattning

Statiska medlemsfunktioner i C++ tillhรถr klassen snarare รคn nรฅgot objekt, sรฅ de fungerar bara pรฅ statiska datamedlemmar, krรคver ingen instans fรถr att anropa och kan inte komma รฅt icke-statiska medlemmar eller this-pekaren.

  • ๐Ÿ“Œ Definition: En statisk medlem tillhรถr sjรคlva klassen, sรฅ en delad kopia finns oavsett hur mรฅnga objekt som skapas.
  • ๐Ÿ” Delat tillstรฅnd: Varje objekt har รฅtkomst till samma statiska datamedlem, vilket gรถr det idealiskt fรถr klassomfattande rรคknare eller delad konfiguration.
  • ๐Ÿšช Inget fรถremรฅl behรถvs: Statiska medlemsfunktioner anropas med hjรคlp av klassnamnet och omfรฅngsupplรถsningsoperatorn, utan att instansiera nรฅgot objekt.
  • ???? ร…tkomstgrรคnser: En statisk funktion kan inte anvรคnda this-pekaren och fรฅr endast komma รฅt statiska medlemmar, inte instansspecifika data.
  • ๐Ÿงฉ Syntaxmรถnster: Deklarera med nyckelordet static inuti klassen och definiera det utanfรถr med hjรคlp av ClassName::functionName.

Statisk medlemsfunktion i C++

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.

Med motiveringen bakom statiska funktioner tydlig, รคr nรคsta steg att se hur de definieras i C++ koda.

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

Code Fรถ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

Code Fรถ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

Code Fรถ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.

En viktig begrรคnsning fรถrklarar varfรถr statiska funktioner beter sig annorlunda รคn vanliga metoder, nรคmligen avsaknaden av this-pekaren.

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

Code Fรถ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.

Vanliga frรฅgor

En statisk medlemsfunktion tillhรถr klassen, inte vilket objekt som helst. Den kan anropas utan att skapa en instans och kan endast komma รฅt statiska datamedlemmar i den klassen.

En statisk medlemsvariabel lagrar ett delat vรคrde fรถr alla objekt, medan en statisk medlemsfunktion arbetar pรฅ dessa delade variabler utan att behรถva en objektinstans.

Statiska funktioner รคr inte knutna till nรฅgot objekt, sรฅ denna pekare existerar inte. De arbetar pรฅ klassnivรฅ och kan dรคrfรถr inte komma รฅt icke-statiska medlemmar.

Anropa den med klassnamnet och omfรฅngsupplรถsningsoperatorn, till exempel ClassName::function(), utan att skapa nรฅgot objekt fรถr klassen.

Nej. En statisk medlemsfunktion kan endast komma รฅt statiska datamedlemmar och andra statiska funktioner, eftersom den inte har nรฅgon objektkontext fรถr att nรฅ instansdata.

AI-assistenter som GitHub Copilot fรถreslรฅr statiska metodsignaturer, genererar standardbeskrivningar, flaggar missbruk av denna pekare och fรถrklarar nรคr en klassnivรฅfunktion passar designen bรคttre รคn en instansmetod.

Ja. AI-drivna linters och IDE:er upptรคcker olaglig รฅtkomst till icke-statiska medlemmar, saknade definitioner utanfรถr klassen och initialiseringsfel fรถr statiska variabler innan kompileringen misslyckas.

Anvรคnd en fรถr klassรถvergripande beteende som inte รคr beroende av objekttillstรฅnd, till exempel rรคknare, fabriksmetoder eller verktygshjรคlpare som delas รถver alla instanser.

Sammanfatta detta inlรคgg med: