Predpogoj: Statične spremenljivke v C
verilog vedno
Statična ključna beseda ima različne pomene, kadar se uporablja z različnimi vrstami. Statične ključne besede lahko uporabljamo z:
- Statične spremenljivke: spremenljivke v funkciji, spremenljivke v razredu Statični člani razreda: predmeti razreda in funkcije v razredu Oglejmo si zdaj podrobno vsako od teh uporab statike.
Statične spremenljivke
Statične spremenljivke v funkciji : Ko je spremenljivka deklarirana kot statična, prostor za dodeljena je za celotno življenjsko dobo programa . Tudi če je funkcija večkrat poklicana, je prostor za statično spremenljivko dodeljen samo enkrat in vrednost spremenljivke v prejšnjem klicu se prenese skozi naslednji klic funkcije. To je uporabno za izvajanje korutin v C/C++ ali kateri koli drugi aplikaciji, kjer je treba shraniti prejšnje stanje funkcije.
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;> }> |
>
>Izhod
0 1 2 3 4>
V zgornjem programu lahko vidite, da je spremenljivka count deklarirana kot statična. Torej se njegova vrednost prenaša skozi funkcijske klice. Število spremenljivk se ne inicializira ob vsakem klicu funkcije. Kot stransko opombo, Java ne dovoljuje statičnih lokalnih spremenljivk v funkcijah.
Statične spremenljivke v razredu : Ker so spremenljivke, ki so deklarirane kot statične, inicializirane samo enkrat, saj jim je dodeljen prostor v ločenem statičnem pomnilniku, so statične spremenljivke v razredu si delijo objekti. Za različne objekte ne more obstajati več kopij istih statičnih spremenljivk. Tudi zaradi tega razloga statičnih spremenljivk ni mogoče inicializirati s konstruktorji.
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;> }> |
>
>
Izhod
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
V zgornjem programu lahko vidite, da smo poskušali ustvariti več kopij statične spremenljivke i za več predmetov. Vendar se to ni zgodilo. Torej mora statično spremenljivko znotraj razreda uporabnik izrecno inicializirati z uporabo imena razreda in operatorja za razrešitev obsega zunaj razreda, kot je prikazano spodaj:
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;> }> |
numpy edinstven
>
>Izhod
1>
Statični člani razreda
Predmete razreda kot statične : Tako kot spremenljivke imajo tudi objekti, če so deklarirani kot statični, obseg do življenjske dobe programa. Razmislite o spodnjem programu, kjer objekt ni statičen.
C++
ponavljanje zemljevida 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
'>;> }> |
>
>Izhod
Inside Constructor Inside Destructor End of main>
V zgornjem programu je predmet znotraj bloka if deklariran kot nestatičen. Torej je obseg spremenljivke samo znotraj bloka if. Torej, ko je objekt ustvarjen, se prikliče konstruktor in kmalu, ko nadzor nad blokom if prevzame destruktor, se prikliče, saj je obseg predmeta znotraj bloka if samo tam, kjer je deklariran. Poglejmo zdaj spremembo izhoda, če objekt razglasimo za statičnega.
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
'>;> }> |
>
>Izhod
Inside Constructor End of main Inside Destructor>
Jasno lahko vidite spremembo proizvodnje. Zdaj se destruktor prikliče po koncu glavnega. To se je zgodilo, ker je obseg statičnih objektov ves čas trajanja programa.
Statične funkcije v razredu : Tako kot statični podatkovni člani ali statične spremenljivke znotraj razreda tudi statične članske funkcije niso odvisne od predmeta razreda. Dovoljeno nam je, da prikličemo statično funkcijo člana z uporabo objekta in operatorja '.', vendar je priporočljivo, da prikličemo statične člane z uporabo imena razreda in operatorja za razrešitev obsega. Statičnim članskim funkcijam je dovoljen dostop samo do statičnih podatkovnih članov ali drugih statičnih članskih funkcij , ne morejo dostopati do nestatičnih podatkovnih članov ali članskih funkcij razreda.
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();> }> |
100 kmh do mph
>
>Izhod
Welcome to GfG!>
Povezani članki:
- Kviz o statičnih ključnih besedah
- Statični podatkovni člani v C++
- Kdaj se uničijo statični objekti?
- Zanimiva dejstva o statičnih funkcijah članov
- Ali so lahko statične funkcije virtualne?
- Primerjava statične ključne besede v C++ in Javi
- Statične funkcije v C