logo

Staattinen avainsana C++:ssa

Edellytys: C:n staattiset muuttujat

java erotin

Staattisella avainsanalla on eri merkitys, kun sitä käytetään eri tyyppien kanssa. Voimme käyttää staattisia avainsanoja seuraavien kanssa:

    Staattiset muuttujat: funktion muuttujat, luokan muuttujat Staattiset luokan jäsenet: luokan objektit ja funktiot. Tarkastellaan nyt kutakin näistä staattisen toiminnan käytöstä yksityiskohtaisesti.

Staattiset muuttujat

Staattiset muuttujat funktiossa : Kun muuttuja on ilmoitettu staattiseksi, tilaa se jaetaan ohjelman elinkaareksi . Vaikka funktiota kutsuttaisiin useita kertoja, tilaa staattiselle muuttujalle varataan vain kerran ja edellisen kutsun muuttujan arvo kulkee seuraavan funktiokutsun kautta. Tämä on hyödyllistä toteutettaessa korutiineja C/C++:ssa tai missä tahansa muussa sovelluksessa, jossa edellinen toiminnon tila on tallennettava.



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

>

>

Lähtö

0 1 2 3 4>

Yllä olevasta ohjelmasta näet, että muuttujien määrä on staattinen. Joten sen arvo kulkee funktiokutsujen kautta. Muuttujien määrä ei alusta joka kerta, kun funktiota kutsutaan. Sivuhuomautuksena Java ei salli staattisia paikallismuuttujia funktioissa.

Staattiset muuttujat luokassa : Koska staattisiksi ilmoitetut muuttujat alustetaan vain kerran, kun niille on varattu tilaa erillisessä staattisessa muistissa, staattiset muuttujat luokassa jaetaan objektien kesken. Samoista staattisista muuttujista ei voi olla useita kopioita eri objekteille. Myös tästä syystä staattisia muuttujia ei voida alustaa konstruktoreilla.

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

>

>

Lähtö

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

Näet yllä olevassa ohjelmassa, että olemme yrittäneet luoda useita kopioita staattisesta muuttujasta i useille objekteille. Mutta tämä ei tapahtunut. Joten käyttäjän tulee alustaa staattinen muuttuja luokan sisällä käyttämällä luokan nimeä ja laajuuden resoluutiooperaattoria luokan ulkopuolella, kuten alla on esitetty:

C++




jos muuten lauseke javassa

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

>

>

Lähtö

1>

Staattiset luokan jäsenet

Luokittele objektit staattisiksi : Kuten muuttujilla, myös staattisiksi julistetuilla objekteilla on ulottuvuus ohjelman elinikään asti. Harkitse alla olevaa ohjelmaa, jossa objekti on ei-staattinen.

C++


kapselointi javassa



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

>

>

Lähtö

Inside Constructor Inside Destructor End of main>

Yllä olevassa ohjelmassa objekti on ilmoitettu if-lohkon sisällä ei-staattiseksi. Joten muuttujan laajuus on vain if-lohkon sisällä. Joten kun objekti luodaan, konstruktori vedetään ja heti, kun if-lohkon ohjaus ylittää destruktorin, vedotaan, koska objektin laajuus on if-lohkon sisällä vain siellä, missä se on ilmoitettu. Katsotaan nyt tulosten muutos, jos julistetaan objekti staattiseksi.

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

>

>

Lähtö

Inside Constructor End of main Inside Destructor>

Näet selvästi tuotannon muutoksen. Nyt destruktoria kutsutaan pääohjelman päätyttyä. Tämä tapahtui, koska staattisten objektien laajuus on koko ohjelman elinkaaren ajan.

Staattiset funktiot luokassa : Aivan kuten staattiset datajäsenet tai staattiset muuttujat luokan sisällä, staattiset jäsenfunktiot eivät myöskään riipu luokan objektista. Voimme kutsua staattista jäsenfunktiota käyttämällä objektia ja '.'-operaattoria, mutta on suositeltavaa kutsua staattiset jäsenet käyttämällä luokan nimeä ja laajuuden erotteluoperaattoria. Staattiset jäsentoiminnot saavat käyttää vain staattisia datajäseniä tai muita staattisia jäsentoimintoja , he eivät voi käyttää luokan ei-staattisia datajäseniä tai jäsentoimintoja.

C++


merkkijonon muuntaminen int javaksi



// 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();> }>

>

>

Lähtö

Welcome to GfG!>

Aiheeseen liittyvät artikkelit:

  • Staattisen avainsanan tietokilpailu
  • Staattiset datajäsenet C++:ssa
  • Milloin staattiset esineet tuhoutuvat?
  • Mielenkiintoisia faktoja staattisista jäsenfunktioista
  • Voivatko staattiset funktiot olla virtuaalisia?
  • Staattisen avainsanan vertailu C++:ssa ja Javassa
  • Staattiset funktiot C:ssä