Statikus tag funkció be C++ (Példák)

⚡ Okos összefoglaló

Statikus tagfüggvények a C++ az osztályhoz tartoznak, nem pedig bármely objektumhoz, így csak statikus adattagokon működnek, nem igényelnek példányt a meghíváshoz, és nem férhetnek hozzá a nem statikus tagokhoz vagy a this mutatóhoz.

  • 📌 Meghatározás: Egy statikus tag magához az osztályhoz tartozik, tehát egy megosztott példány létezik, függetlenül attól, hogy hány objektum jön létre.
  • 🔁 Megosztott állapot: Minden objektum ugyanahhoz a statikus adattaghoz fér hozzá, így ideális osztályszintű számlálókhoz vagy megosztott konfigurációhoz.
  • 🚪 Nincs szükség objektumra: A statikus tagfüggvényeket az osztálynév és a hatókör-feloldási operátor használatával hívjuk meg, objektum példányosítása nélkül.
  • ???? Hozzáférési korlátok: Egy statikus függvény nem használhatja a this mutatót, és csak statikus tagokhoz férhet hozzá, példányspecifikus adatokhoz nem.
  • 🧩 Szintaxisminta: Deklaráld a static kulcsszóval az osztályon belül, és definiáld kívül a ClassName::functionName használatával.

Statikus tag funkció be C++

Mit tartalmaz a statikus függvény? C++?

In C++ osztályok esetén a statikus tag olyan osztálytag, amely az osztályhoz tartozik, nem pedig az objektumaihoz. A tagságból csak egy példányod lesz. Ez a helyzet a létrehozott objektumok számától függetlenül.

Ha egy osztályfüggvény statikusként van definiálva, az összes osztályobjektum megoszt egy statikus osztálytagot. A statikus függvény tehát osztályobjektumok létrehozása nélkül is elérhető, és függetlenné válik osztályú objektumok. Statikus adattag be C++ más statikus függvényekhez férhet hozzá, csak az osztályon kívül.

Miért érdemes statikus függvényeket használni?

Eltérően C++ a globális függvények, a statikus függvények csak a deklarációs fájlból érhetők el. Ha korlátozni kell egy funkcióhoz való hozzáférést, tegye statikussá.

Használjon statikus függvényt, hogy korlátozza ugyanazon függvénynév egy másik fájlban való újrafelhasználását.

Miután a statikus függvények indoklása világossá vált, a következő lépés annak vizsgálata, hogyan vannak definiálva a C++ kód.

Statikus függvények meghatározása in C++

Syntax:

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

A fenti példában egy myfunc nevű statikus függvényt definiálunk. Figyeljük meg a statikus kulcsszó használatát a definícióban. A kulcsszó a függvény neve elé kerül.

Statikus tag funkció be C++

Amikor egy függvénytagot statikusnak deklarálunk, függetlenné válik az osztály többi objektumától. A statikus tagfüggvényeket akkor is meghívhatja, ha nem létezik más osztályobjektum.

Az osztálynevek eléréséhez használja az osztály nevét és a hatókör-feloldó operátort (::). Egy statikus függvény csak más statikus függvényekhez, statikus adattagokhoz és az osztályon kívüli egyéb funkciókhoz férhet hozzá. A statikus tagfüggvények hatóköre az osztályon belül van, és nem férhetnek hozzá ehhez az osztálymutatóhoz.

Példa 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:

Statikus tagi funkció

Itt van egy képernyőkép a kódról:

Statikus tagi funkció

Code Magyarázat:

  1. Beleértve az iostream fejlécfájlt a mi C++ program használatához funkciók.
  2. Szerelje be az std névteret a kódba, hogy az osztályait hívás nélkül használja.
  3. Hozzon létre egy osztályt nevű BoxOsztály.
  4. Használja a nyilvános hozzáférés módosítót egy nyilvánosan elérhető osztálytag megjelölésére.
  5. A count nevű statikus osztálytag deklarálása.
  6. Használjon osztálykonstruktort három kettős típusú változó inicializálására.
  7. Nyomtasson szöveget a konzolra. Az endl (end line) függvény az egérkurzort a következő sorba mozgatja.
  8. Inicializálja l értékét változó hosszúságúra.
  9. Inicializálja b értékét változó szélességre.
  10. Inicializálja a h értékét változó magasságra.
  11. Ezután minden új objektum létrehozásakor növelje a count változó értékét 1-gyel.
  12. A kivitelező test vége.
  13. Hozzon létre egy doublevolume() nevű függvényt.
  14. Határozza meg, mit adjon vissza a doubleVolume() függvény. A hosszúság, szélesség és magasság változók szorzatát kell visszaadnia.
  15. A doubleVolume() függvénytörzs vége.
  16. Deklaráljon egy statikus függvényt, melynek neve getCount().
  17. A getCount() függvénynek vissza kell adnia a count változó értékét.
  18. A getCount() függvény törzsének vége.
  19. A privát hozzáférés módosító segítségével jelölje meg egy osztálytagot nyilvánosan elérhetőként.
  20. Kettős adattípus hosszának nevezett osztálytag deklarálása. Ez privát módon lesz elérhető.
  21. Deklaráljon egy másik osztálytagot, melynek neve szélessége kettős adattípusnak. Ez privát módon lesz elérhető.
  22. Dupla adattípus magassága nevű osztálytag deklarálása. Ez privát módon lesz elérhető.
  23. A test vége a BoxOsztály osztály.
  24. Ezután inicializálja a statikus tagot BoxOsztály osztály.
  25. A main() függvény meghívása. A C++ programlogikát kell hozzáadni a függvény törzséhez.
  26. Nyomtasson ki szöveget a konzolra az objektumok aktuális számáról, mielőtt új objektumokat hozna létre.
  27. Deklaráljon egy nevű objektumot Box1, amely az osztály egyik példánya BoxOsztály. A szélesség, hosszúság és magasság értékeket zárójelben kell megadni.
  28. Deklaráljon egy nevű objektumot Box2, amely az osztály egy példánya BoxOsztály. A szélesség, hosszúság és magasság értékek a zárójelben vannak megadva.
  29. Nyomtasson ki egy szöveget a konzolra az objektumok aktuális számáról az új objektumok létrehozása után.
  30. Az C++ program értéket kell visszaadnia a sikeres befejezés után.
  31. A main() függvény törzsének vége.

Statikus funkciók elérése

A statikus függvény eléréséhez nem kell osztályobjektumot létrehoznia. Ehelyett használhatja az osztály nevét és a hatókör felbontási operátorát (::).

Syntax:

className::funcName

Fent a className annak az osztálynak a neve, ahol a statikus függvény definiálva van. A funcName a statikus függvényhez rendelt név.

Példa 2

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

output:

Statikus funkciók elérése

Itt van egy képernyőkép a kódról:

Statikus funkciók elérése

Code Magyarázat:

  1. Az iostream fejlécfájl beillesztése a programunkba a funkcióinak használatához.
  2. Szerelje be az std névteret a kódjába, hogy az osztályait hívás nélkül használhassa.
  3. Hozzon létre egy osztályt MyClass néven.
  4. A nyilvános hozzáférés módosító segítségével jelölje meg egy osztálytagot nyilvánosan elérhetőként.
  5. Egy msgFunc() nevű statikus függvény deklarálása. A static kulcsszó statikussá teszi a függvényt.
  6. Adja meg a konzolon kinyomtatni kívánt szöveget a fenti függvény meghívása/meghívása után.
  7. Az msgFunc() függvény törzsének vége.
  8. Fejezd be az osztály törzsét.
  9. A main() függvény meghívása.
  10. Hívja meg az msgFunc() nevű statikus függvényt.
  11. A main() függvény törzsének vége.

Statikus változók elérése

A statikus változók egy osztályhoz tartoznak, nem pedig az osztályobjektumokhoz. Ha egy statikus változó nyilvános, akkor az osztálynévvel és a hatókör felbontási operátorával érhető el. Ez azonban nem lehetséges, ha egy statikus tag privát.

Általában a privát változókhoz nyilvános függvényekkel lehet hozzáférni. Azonban létre kell hozni egy osztálypéldányt/objektumot. A megoldás egy statikus függvény használata.

3. példa: Statikus változó in C++ osztály

#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:

Statikus változók elérése

Itt van egy képernyőkép a kódról:

Statikus változók elérése

Code Magyarázat:

  1. Beleértve az iostream fejlécfájlt a programunkba.
  2. Szerelje be az std névteret ebben a programban, hogy hívás nélkül használja az osztályait.
  3. Hozzon létre egy AClass nevű osztályt.
  4. Használja a privát hozzáférés módosítót, hogy a myvar változót privát módon elérhetővé tegye.
  5. Hozzon létre egy myvar nevű statikus egész változót.
  6. Használja a nyilvános hozzáférés módosítót, amely nyilvánosan elérhetőként jelöli meg a getVar() függvényt.
  7. GetVar() nevű statikus függvény létrehozása.
  8. A getVar() függvénynek képesnek kell lennie a myvar változó értékének visszaadására.
  9. A getVar() függvény törzsének vége.
  10. Az AClass osztály törzsének vége.
  11. A myvar változóhoz 23 értéket rendeljünk. Ehhez az osztálynevet és a hatókör felbontási operátort használtuk.
  12. A main() függvény meghívása.
  13. Nyomtassa ki a myVar változó értékét a konzolon a többi szöveg mellé. Az osztálynevet, a statikus függvényt és a hatókör felbontási operátorát használtuk a változó értékének eléréséhez.
  14. A main() függvénytörzs vége.

Az egyik fő korlátozás megmagyarázza, hogy a statikus függvények miért viselkednek másképp a hagyományos metódusoktól, nevezetesen a this mutató hiánya.

ezt a mutatót a statikus függvényekben

Statikus függvény nincs objektumhoz kötve. Ez az oka annak, hogy a statikus függvények nem rendelkeznek ezzel a mutatóval. Egy objektum mutatója általában arra az objektumra mutat, amelyen éppen dolgozik. Mivel a statikus függvények nem működnek objektumokkal, nincs szükség erre a mutatóra.

A statikus funkciók közvetlen hozzáféréssel rendelkeznek a többi statikus taghoz. Ez azonban nem így van a nem statikus tagoknál. Ennek az az oka, hogy a nem statikus tagoknak egy objektumhoz kell tartozniuk, de a statikus függvényeknek nincsenek objektumai, amelyekkel dolgozni kellene.

Példa 4

Lehetőség van statikus függvény definiálására az osztálydeklaráción kívül. Mutassuk meg ezt:

#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:

ezt a mutatót a statikus függvényekben

Íme egy képernyőkép a kódodról:

ezt a mutatót a statikus függvényekben

Code Magyarázat:

  1. Az iostream fejlécfájl belefoglalása a kódunkba a funkcióinak használatához.
  2. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hozzon létre egy osztályt Num névenGenerator.
  4. A privát hozzáférés módosító segítségével a változó megjelölésére készülünk, hogy privátként hozzáférhetőként hozzuk létre.
  5. Hozzon létre egy nextNum nevű statikus egész változót.
  6. A nyilvános hozzáférés módosító használata, amely segít megjelölni a létrehozandó változót nyilvánosan hozzáférhetőként.
  7. A getNextNum() nevű statikus függvény deklarálása.
  8. Az osztálytörzs vége.
  9. A nextNum változóhoz rendeljen 1 értéket. Ezt az osztálynév, a változónév és a hatókör-feloldó operátor használatával tettük meg.
  10. A getNextNum() statikus függvény meghatározása az osztályon kívül.
  11. Adja meg a műveletet, amelyet a fenti függvény meghívásakor/meghívásakor kell végrehajtani. A nextNum változó értékét 1-gyel növeli.
  12. A getNextNum() függvény definíciójának vége.
  13. A main() függvény meghívása. A C++ programlogikát kell hozzáadni ennek a függvénynek a törzsébe.
  14. Használat hurokhoz count nevű változó létrehozásához. Ennek a változónak 0-ról 4-re kell növekednie. Minden iteráció után a változó értéke 1-gyel nő.
  15. A nextNum változó értékének kinyomtatása a konzolon lévő többi szöveg mellett minden iterációnál. Az érték a getNextNum() függvény segítségével érhető el.
  16. Ez a C++ a programnak értéket kell visszaadnia a sikeres befejezés után.
  17. A main() függvény vége.

GYIK

A statikus tagfüggvény az osztályhoz tartozik, nem pedig bármelyik objektumhoz. Példány létrehozása nélkül hívható meg, és csak az adott osztály statikus adattagjaihoz férhet hozzá.

Egy statikus tagváltozó egyetlen megosztott értéket tárol az összes objektumhoz, míg egy statikus tagfüggvény ezekkel a megosztott változókkal objektumpéldány nélkül működik.

A statikus függvények nincsenek objektumhoz kötve, így ez a mutató nem létezik. Osztályszinten működnek, ezért nem férhetnek hozzá a nem statikus tagokhoz.

Hívd meg az osztály nevével és a hatókör feloldási operátorával, például ClassName::function(), anélkül, hogy létrehoznál bármilyen objektumot az osztályból.

Nem. Egy statikus tagfüggvény csak statikus adattagokhoz és más statikus függvényekhez férhet hozzá, mivel nincs objektumkontextusa a példányadatok eléréséhez.

Az olyan mesterséges intelligencia asszisztensek, mint a GitHub Copilot, statikus metódusaláírásokat javasolnak, sablonfüggvényeket generálnak, jelzik a „this-pointer” helytelen használatát, és elmagyarázzák, hogy mikor illik egy osztályszintű függvény jobban a tervhez, mint egy példánymetódus.

Igen. A mesterséges intelligenciával működő linterek és IDE-k a fordítás meghiúsulása előtt észlelik a nem statikus tagokhoz való illegális hozzáférést, a hiányzó osztályon kívüli definíciókat és a statikus változók inicializálási hibáit.

Használjon egyet az osztály egészére kiterjedő viselkedéshez, amely nem függ az objektum állapotától, például számlálók, gyári metódusok vagy az összes példány között megosztott segédprogramok.

Foglald össze ezt a bejegyzést a következőképpen: