Predpoklad: Statické premenné v C
binárny vyhľadávací strom vs binárny strom
Statické kľúčové slovo má pri použití s rôznymi typmi rôzne významy. Statické kľúčové slová môžeme použiť s:
- Statické premenné: Premenné vo funkcii, Premenné v triede Statické Členovia triedy: Objekty triedy a funkcie v triede Pozrime sa teraz podrobne na každé z týchto použití statiky.
Statické premenné
Statické premenné vo funkcii : Keď je premenná deklarovaná ako statická, medzera pre pridelí sa na dobu životnosti programu . Aj keď sa funkcia volá viackrát, priestor pre statickú premennú sa pridelí iba raz a hodnota premennej v predchádzajúcom volaní sa prenesie cez ďalšie volanie funkcie. To je užitočné pri implementácii korutínov v C/C++ alebo akejkoľvek inej aplikácii, kde je potrebné uložiť predchádzajúci stav funkcie.
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ýkon
0 1 2 3 4>
Vo vyššie uvedenom programe môžete vidieť, že počet premenných je deklarovaný ako statický. Jeho hodnota sa teda prenáša prostredníctvom volaní funkcií. Počet premenných sa neinicializuje pri každom volaní funkcie. Ako vedľajšia poznámka, Java nepovoľuje statické lokálne premenné vo funkciách .
Statické premenné v triede : Keďže premenné deklarované ako statické sa inicializujú iba raz, pretože im je pridelený priestor v samostatnom statickom úložisku, takže statické premenné v triede sú zdieľané objektmi. Nemôže existovať viacero kópií rovnakých statických premenných pre rôzne objekty. Aj z tohto dôvodu nie je možné inicializovať statické premenné pomocou konštruktorov.
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ýkon
java číta súbor riadok po riadku
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
Vo vyššie uvedenom programe môžete vidieť, že sme sa pokúsili vytvoriť viacero kópií statickej premennej i pre viacero objektov. Ale toto sa nestalo. Statická premenná vo vnútri triedy by teda mala byť inicializovaná explicitne používateľom pomocou názvu triedy a operátora rozlíšenia rozsahu mimo triedy, ako je uvedené nižšie:
C++
// 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ýkon
1>
Statické Členovia triedy
Triediť objekty ako statické : Rovnako ako premenné, aj objekty, keď sú deklarované ako statické, majú rozsah až do životnosti programu. Zvážte nižšie uvedený program, kde je objekt nestatický.
C++
slučka java do while
// 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ýkon
Inside Constructor Inside Destructor End of main>
Vo vyššie uvedenom programe je objekt deklarovaný vo vnútri bloku if ako nestatický. Rozsah premennej je teda iba vo vnútri bloku if. Takže keď je objekt vytvorený, je vyvolaný konštruktor a hneď ako kontrola nad if blokom prekoná deštruktor, je vyvolaná, pretože rozsah objektu je vnútri bloku if iba tam, kde je deklarovaný. Pozrime sa teraz na zmenu vo výstupe, ak deklarujeme objekt ako 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ýkon
reťazec obsahuje java
Inside Constructor End of main Inside Destructor>
Môžete jasne vidieť zmenu vo výstupe. Teraz je deštruktor vyvolaný po skončení hlavného programu. Stalo sa to preto, že rozsah statických objektov je počas životnosti programu.
Statické funkcie v triede : Rovnako ako statické dátové členy alebo statické premenné vnútri triedy, ani statické členské funkcie nezávisia od objektu triedy. Môžeme vyvolať funkciu statického člena pomocou objektu a operátora „.“, ale odporúča sa vyvolať statické členy pomocou názvu triedy a operátora rozlíšenia rozsahu. Funkcie statických členov majú povolený prístup len k členom statických údajov alebo iným statickým členským funkciám , nemajú prístup k nestatickým dátovým členom alebo členským funkciám triedy.
C++
// 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ýkon
Welcome to GfG!>
Súvisiace články:
- Kvíz o statickom kľúčovom slove
- Statické dátové členy v C++
- Kedy sú zničené statické objekty?
- Zaujímavé fakty o statických členských funkciách
- Môžu byť statické funkcie virtuálne?
- Porovnanie statického kľúčového slova v C++ a Java
- Statické funkcie v C