logo

Statické klíčové slovo v C++

Předpoklad: Statické proměnné v C

selen

Klíčové slovo statické má při použití s ​​různými typy různý význam. Statická klíčová slova můžeme použít s:



    Statické proměnné: Proměnné ve funkci, Proměnné ve třídě Statické Členy třídy: Objekty třídy a funkce ve třídě Podívejme se nyní podrobně na každé z těchto použití statiky.

Statické proměnné

Statické proměnné ve funkci : Když je proměnná deklarována jako statická, mezera pro je přiděleno po dobu životnosti programu . I když je funkce volána vícekrát, místo pro statickou proměnnou je alokováno pouze jednou a hodnota proměnné v předchozím volání se přenese přes další volání funkce. To je užitečné pro implementaci korutin v C/C++ nebo jakékoli jiné aplikaci, kde je třeba uložit předchozí stav funkce.

C++








// C++ program to demonstrate> // the use of static Static> // variables in a Function> #include> #include> using> namespace> std;> void> demo()> {> >// static variable> >static> int> count = 0;> >cout << count <<>;> >// value is updated and> >// will be carried to next> >// function calls> >count++;> }> int> main()> {> >for> (>int> i = 0; i <5; i++)> >demo();> >return> 0;> }>

>

>

Výstup

0 1 2 3 4>

Ve výše uvedeném programu můžete vidět, že počet proměnných je deklarován jako statický. Jeho hodnota je tedy přenášena prostřednictvím volání funkcí. Počet proměnných se neinicializuje při každém volání funkce. Jako vedlejší poznámka, Java nepovoluje statické lokální proměnné ve funkcích.

Statické proměnné ve třídě : Protože proměnné deklarované jako statické jsou inicializovány pouze jednou, protože jim je přidělen prostor v samostatném statickém úložišti, takže statické proměnné ve třídě jsou sdíleny objekty. Nemůže existovat více kopií stejných statických proměnných pro různé objekty. Také z tohoto důvodu nelze statické proměnné inicializovat pomocí konstruktorů.

C++




// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> main()> {> >GfG obj1;> >GfG obj2;> >obj1.i = 2;> >obj2.i = 3;> >// prints value of i> >cout << obj1.i <<> << obj2.i;> }>

>

>

Výstup

undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>

Ve výše uvedeném programu můžete vidět, že jsme se pokusili vytvořit více kopií statické proměnné i pro více objektů. Ale to se nestalo. Statická proměnná uvnitř třídy by tedy měla být inicializována explicitně uživatelem pomocí názvu třídy a operátoru rozlišení rozsahu mimo třídu, jak je uvedeno níže:

C++




javascript window.open

// C++ program to demonstrate static> // variables inside a class> #include> using> namespace> std;> class> GfG {> public>:> >static> int> i;> >GfG(){> >// Do nothing> >};> };> int> GfG::i = 1;> int> main()> {> >GfG obj;> >// prints value of i> >cout << obj.i;> }>

>

>

Výstup

1>

Statické členy třídy

Objekty třídit jako statické : Stejně jako proměnné mají i objekty, když jsou deklarovány jako statické, rozsah až do doby životnosti programu. Zvažte níže uvedený program, kde je objekt nestatický.

C++


řetězcové funkce java



// CPP program to illustrate> // when not using static keyword> #include> using> namespace> std;> class> GfG {> >int> i;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor '>;> >}> >~GfG() { cout <<>'Inside Destructor '>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >GfG obj;> >}> >cout <<>'End of main '>;> }>

>

>

Výstup

Inside Constructor Inside Destructor End of main>

Ve výše uvedeném programu je objekt deklarován uvnitř bloku if jako nestatický. Rozsah proměnné je tedy pouze uvnitř bloku if. Takže když je objekt vytvořen, je vyvolán konstruktor a jakmile se ovládání if bloku dostane přes destruktor, je vyvoláno, protože rozsah objektu je uvnitř bloku if pouze tam, kde je deklarován. Podívejme se nyní na změnu výstupu, pokud objekt deklarujeme jako statický.

C++




// CPP program to illustrate> // class objects as static> #include> using> namespace> std;> class> GfG {> >int> i = 0;> public>:> >GfG()> >{> >i = 0;> >cout <<>'Inside Constructor '>;> >}> >~GfG() { cout <<>'Inside Destructor '>; }> };> int> main()> {> >int> x = 0;> >if> (x == 0) {> >static> GfG obj;> >}> >cout <<>'End of main '>;> }>

>

>

Výstup

Inside Constructor End of main Inside Destructor>

Změnu výstupu můžete jasně vidět. Nyní je destruktor vyvolán po skončení hlavního programu. Stalo se to proto, že rozsah statických objektů je po celou dobu životnosti programu.

Statické funkce ve třídě : Stejně jako statické datové členy nebo statické proměnné uvnitř třídy, statické členské funkce také nezávisí na objektu třídy. Můžeme vyvolat funkci statického člena pomocí objektu a operátoru ‚.‘, ale doporučujeme vyvolat statické členy pomocí názvu třídy a operátoru rozlišení rozsahu. Statické členské funkce mají povolen přístup pouze ke statickým datovým členům nebo jiným statickým členským funkcím , nemají přístup k nestatickým datovým členům nebo členským funkcím třídy.

C++


tisknout vzor hvězdy



// C++ program to demonstrate static> // member function in a class> #include> using> namespace> std;> class> GfG {> public>:> >// static member function> >static> void> printMsg() { cout <<>'Welcome to GfG!'>; }> };> // main function> int> main()> {> >// invoking a static member function> >GfG::printMsg();> }>

>

>

Výstup

Welcome to GfG!>

Související články:

  • Kvíz o statických klíčových slovech
  • Statické datové členy v C++
  • Kdy jsou zničeny statické objekty?
  • Zajímavá fakta o statických členských funkcích
  • Mohou být statické funkce virtuální?
  • Porovnání statického klíčového slova v C++ a Javě
  • Statické funkce v C