Funkce statického člena v C++ (Příklady)

V čem je statická funkce C++?

In C++ tříd, statický člen je člen třídy, který patří spíše do třídy než do jejích objektů. Budete mít pouze jednu kopii členství. To je případ bez ohledu na počet objektů, které vytvoříte.

Když je funkce třídy definována jako statická, všechny objekty třídy sdílejí statického člena třídy. Ke statické funkci lze proto přistupovat bez vytváření objektů třídy a stává se na nich nezávislou objekty třídy. Statický datový člen v C++ má přístup k dalším statickým funkcím, pouze mimo třídu.

Proč používat statické funkce?

Na rozdíl od C++ globální funkce, statické funkce jsou přístupné pouze ze souboru deklarace. Pokud je potřeba omezit přístup k funkci, nastavte ji na statickou.

Použijte statickou funkci k omezení opětovného použití stejného názvu funkce v jiném souboru.

Definování statických funkcí v C++

Syntaxe:

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

Ve výše uvedeném příkladu definujeme statickou funkci s názvem myfunc. Všimněte si použití klíčového slova static v definici. Klíčové slovo je před názvem funkce.

Funkce statického člena v C++

Když je člen funkce deklarován jako statický, stává se nezávislým na ostatních objektech ve třídě. Statické členské funkce můžete volat, i když neexistují žádné jiné objekty třídy.

Pro přístup k názvům tříd byste měli použít název třídy a operátor rozlišení rozsahu (::). Statická funkce má přístup pouze k dalším statickým funkcím, statickým datovým členům a dalším funkcím mimo třídu. Rozsah statických členských funkcí leží v rámci třídy a nemají přístup k tomuto ukazateli třídy.

Příklad 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;
}

Výstup:

Funkce statického člena

Zde je snímek obrazovky kódu:

Funkce statického člena

Vysvětlení kódu:

  1. Včetně souboru záhlaví iostream v našem C++ program k jeho použití funkce.
  2. Zahrňte do kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  3. Vytvořte třídu s názvem BoxTřída
  4. Pomocí modifikátoru veřejného přístupu označte člena třídy, který je veřejně přístupný.
  5. Deklaruje statický člen třídy s názvem count.
  6. Použijte konstruktor třídy k inicializaci tří proměnných dvojitého typu.
  7. Vytiskněte nějaký text na konzoli. Funkce endl (konec řádku) přesune kurzor myši na další řádek.
  8. Inicializujte hodnotu l na proměnnou délku.
  9. Inicializujte hodnotu b na proměnnou šířku.
  10. Inicializujte hodnotu h na proměnnou výšku.
  11. Poté zvyšte hodnotu počtu proměnné o 1 pokaždé, když je vytvořen nový objekt.
  12. Konec těla konstruktoru.
  13. Vytvořte funkci s názvem doublevolume().
  14. Definujte, co funkce doubleVolume() vrátí. Měl by vrátit násobení proměnných délky, šířky a výšky.
  15. Konec těla funkce doubleVolume().
  16. Deklarujte statickou funkci s názvem getCount().
  17. Funkce getCount() by měla vrátit hodnotu proměnné count.
  18. Konec těla funkce getCount().
  19. K označení člena třídy jako veřejně přístupného použijte modifikátor soukromého přístupu.
  20. Deklarování člena třídy s názvem length dvojitého datového typu. Bude soukromě přístupný.
  21. Deklarujte jiného člena třídy s názvem šířka dvojitého datového typu. Bude soukromě přístupný.
  22. Deklarování člena třídy s názvem výška dvojitého datového typu. Bude soukromě přístupný.
  23. Konec těla BoxTřída třídy.
  24. Poté inicializujte statický člen souboru BoxTřída třídy.
  25. Volání funkce main(). The C++ logika programu by měla být přidána do těla této funkce.
  26. Před vytvořením nových objektů vytiskněte na konzole nějaký text s uvedením aktuálního počtu objektů.
  27. Deklarujte objekt s názvem Box1, což je jedna z instancí třídy BoxTřída. Hodnoty šířky, délky a výšky by měly být uvedeny v závorkách.
  28. Deklarujte objekt s názvem Box2, což je instance třídy BoxTřída. Hodnoty šířky, délky a výšky byly specifikovány v závorkách.
  29. Po vytvoření nových objektů vytiskněte na konzoli text s uvedením aktuálního počtu objektů.
  30. Jedno C++ program musí po úspěšném dokončení vrátit hodnotu.
  31. Konec těla funkce main().

Přístup ke statickým funkcím

Pro přístup ke statické funkci není nutné vytvářet objekt třídy. Místo toho můžete použít název třídy a operátor rozlišení oboru (::).

Syntaxe:

className::funcName

Výše uvedený className je název třídy, kde byla definována statická funkce. FuncName je název přiřazený statické funkci.

Příklad 2

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

Výstup:

Přístup ke statickým funkcím

Zde je snímek obrazovky kódu:

Přístup ke statickým funkcím

Vysvětlení kódu:

  1. Včetně hlavičkového souboru iostream do našeho programu pro použití jeho funkcí.
  2. Zahrňte do svého kódu jmenný prostor std, abyste mohli používat jeho třídy, aniž byste jej museli volat.
  3. Vytvořte třídu s názvem MyClass.
  4. Pomocí modifikátoru veřejného přístupu označte člena třídy jako veřejně přístupného.
  5. Deklarace statické funkce s názvem msgFunc(). Klíčové slovo static dělá funkci statickou.
  6. Zadejte text, který se má vytisknout na konzole po zavolání/vyvolání výše uvedené funkce.
  7. Konec těla funkce msgFunc().
  8. Ukončete tělo třídy.
  9. Volání funkce main().
  10. Zavolejte statickou funkci s názvem msgFunc().
  11. Konec těla funkce main().

Přístup ke statickým proměnným

Statické proměnné patří spíše do třídy než do objektů třídy. Pokud je statická proměnná veřejná, je přístupná pomocí názvu třídy a pomocí operátoru rozlišení rozsahu. To však není možné, pokud je statický člen soukromý.

Normálně se k soukromým proměnným přistupuje pomocí veřejných funkcí. Musí však být vytvořena instance/objekt třídy. Řešením je použití statické funkce.

Příklad 3: Statická proměnná in C++ třída

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

Výstup:

Přístup ke statickým proměnným

Zde je snímek obrazovky kódu:

Přístup ke statickým proměnným

Vysvětlení kódu:

  1. Včetně hlavičkového souboru iostream v našem programu.
  2. Zahrňte do tohoto programu jmenný prostor std, abyste mohli používat jeho třídy bez volání.
  3. Vytvořte třídu s názvem AClass.
  4. Pomocí modifikátoru soukromého přístupu zpřístupněte proměnnou myvar soukromě.
  5. Vytvořte statickou celočíselnou proměnnou s názvem myvar.
  6. Použijte modifikátor veřejného přístupu, který označí funkci getVar() jako veřejně přístupnou.
  7. Vytvoření statické funkce s názvem getVar().
  8. Funkce getVar() by měla být schopna vrátit hodnotu proměnné myvar.
  9. Konec těla funkce getVar().
  10. Konec těla třídy ACclass.
  11. Přiřaďte proměnné myvar hodnotu 23. K tomu jsme použili název třídy a operátor rozlišení rozsahu.
  12. Volání funkce main().
  13. Vytiskněte hodnotu proměnné myVar na konzole spolu s jiným textem. Pro přístup k hodnotě této proměnné jsme použili název třídy, statickou funkci a operátor rozlišení rozsahu.
  14. Konec těla funkce main().

tento ukazatel ve statických funkcích

Statická funkce není připojena k objektu. To je důvod, proč statické funkce nemají tento ukazatel. Ukazatel objektu obvykle ukazuje na objekt, na kterém právě pracuje. Protože statické funkce nepracují s objekty, není tento ukazatel potřeba.

Statické funkce mají přímý přístup k ostatním statickým členům. To však není případ nestatických členů. Důvodem je, že nestatické členy musí patřit k objektu, ale statické funkce nemají objekty, se kterými by mohly pracovat.

Příklad 4

Je možné definovat statickou funkci mimo deklaraci třídy. Pojďme si to ukázat:

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

Výstup:

tento ukazatel ve statických funkcích

Zde je snímek obrazovky vašeho kódu:

tento ukazatel ve statických funkcích

Vysvětlení kódu:

  1. Zahrnutí hlavičkového souboru iostream do našeho kódu pro použití jeho funkcí.
  2. Zahrňte do našeho kódu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  3. Vytvořte třídu s názvem NumGenerator.
  4. Pomocí modifikátoru soukromého přístupu k označení proměnné, kterou se chystáme vytvořit jako soukromě přístupnou.
  5. Vytvořte statickou celočíselnou proměnnou s názvem nextNum.
  6. Pomocí modifikátoru veřejného přístupu, který vám pomůže označit proměnnou, kterou se chystáme vytvořit, jako veřejně přístupnou.
  7. Deklarování statické funkce s názvem getNextNum().
  8. Konec těla třídy.
  9. Přiřaďte proměnné nextNum hodnotu 1. Udělali jsme to pomocí názvu třídy, názvu proměnné a operátoru rozlišení rozsahu.
  10. Definování statické funkce getNextNum() mimo třídu.
  11. Zadejte akci, která se má provést, když je zavolána/vyvolána výše uvedená funkce. Zvýší hodnotu proměnné nextNum o 1.
  12. Konec definice funkce getNextNum().
  13. Volání funkce main(). The C++ logika programu by měla být přidána do těla této funkce.
  14. Použití pro smyčku k vytvoření proměnné s názvem count. Hodnota této proměnné by se měla zvyšovat od 0 do 4. Po každé iteraci se hodnota proměnné zvýší o 1.
  15. Tisk hodnoty proměnné nextNum vedle jiného textu na konzole při každé iteraci. K hodnotě se přistupuje pomocí funkce getNextNum().
  16. Tento C++ program musí po úspěšném dokončení vrátit hodnotu.
  17. Konec funkce main().

Shrnutí

  • C++ statické členy jsou členy třídy, které patří spíše do třídy než do jejích objektů.
  • Budete mít pouze jednu kopii statického člena bez ohledu na počet objektů, které vytvoříte.
  • Všechny objekty třídy sdílejí každý statický člen třídy.
  • Po definování funkce třídy jako statické se tato stane nezávislou na objektech třídy.
  • Ke statické funkci lze přistupovat, i když nevytvoříte žádný objekt třídy.
  • Statické funkce však tento objekt, který ukazuje na objekty třídy, nemají.