Requisit previ: Variables estàtiques en C
programa principal en java
La paraula clau estàtica té diferents significats quan s'utilitza amb diferents tipus. Podem utilitzar paraules clau estàtiques amb:
- Variables estàtiques: variables en una funció, variables en una classe Membres estàtics de classe: objectes de classe i funcions en una classe Vegem ara amb detall cadascun d'aquests usos de l'estàtica.
Variables estàtiques
Variables estàtiques en una funció : Quan una variable es declara com a estàtica, espai per a s'assigna durant la vida útil del programa . Fins i tot si la funció es crida diverses vegades, l'espai per a la variable estàtica només s'assigna una vegada i el valor de la variable de la crida anterior es porta a la següent crida de funció. Això és útil per implementar corrutines en C/C++ o qualsevol altra aplicació on s'hagi d'emmagatzemar l'estat anterior de la funció.
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;> }> |
>
>Sortida
0 1 2 3 4>
Podeu veure al programa anterior que el recompte de variables es declara estàtic. Per tant, el seu valor es porta a través de les trucades de funció. El recompte de variables no s'inicia cada vegada que es crida la funció. Com a nota al marge, Java no permet variables locals estàtiques a les funcions.
Variables estàtiques en una classe : com que les variables declarades com a estàtiques s'inicialitzen només una vegada, ja que se'ls assigna espai en un emmagatzematge estàtic separat, per tant, les variables estàtiques en una classe són compartits pels objectes. No hi pot haver diverses còpies de les mateixes variables estàtiques per a diferents objectes. També per aquest motiu les variables estàtiques no es poden inicialitzar mitjançant constructors.
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;> }> |
>
>
Sortida
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
Podeu veure al programa anterior que hem intentat crear diverses còpies de la variable estàtica i per a diversos objectes. Però això no va passar. Per tant, una variable estàtica dins d'una classe hauria de ser inicialitzada explícitament per l'usuari utilitzant el nom de classe i l'operador de resolució d'abast fora de la classe, tal com es mostra a continuació:
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;> }> |
>
1 de 1000
>Sortida
1>
Membres estàtics de la classe
Classe els objectes com a estàtics : Igual que les variables, els objectes també quan es declaren com a estàtics tenen un abast fins a la vida útil del programa. Considereu el programa següent on l'objecte no és estàtic.
C++
botó tkinter
// 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
'>;> }> |
>
>Sortida
Inside Constructor Inside Destructor End of main>
Al programa anterior, l'objecte es declara dins del bloc if com a no estàtic. Per tant, l'abast d'una variable només es troba dins del bloc if. Així, quan es crea l'objecte, s'invoca el constructor i tan aviat com el control de si el bloc supera el destructor s'invoca, ja que l'abast de l'objecte es troba dins del bloc if només on es declara. Vegem ara el canvi en la sortida si declarem l'objecte com a estàtic.
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
'>;> }> |
>
>Sortida
Inside Constructor End of main Inside Destructor>
Podeu veure clarament el canvi en la sortida. Ara s'invoca el destructor després del final del principal. Això va passar perquè l'abast dels objectes estàtics és durant tota la vida útil del programa.
Funcions estàtiques en una classe : Igual que els membres de dades estàtiques o les variables estàtiques dins de la classe, les funcions dels membres estàtics tampoc depenen de l'objecte de la classe. Podem invocar una funció de membre estàtica mitjançant l'objecte i l'operador '.', però es recomana invocar els membres estàtics utilitzant el nom de classe i l'operador de resolució d'àmbit. Les funcions de membre estàtics només poden accedir als membres de dades estàtiques o altres funcions de membre estàtics , no poden accedir als membres de dades no estàtiques ni a les funcions membres de la classe.
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();> }> |
Python de cerca binària
>
>Sortida
Welcome to GfG!>
Articles relacionats:
- Test sobre paraula clau estàtica
- Membres de dades estàtiques en C++
- Quan es destrueixen els objectes estàtics?
- Dades interessants sobre les funcions membre estàtiques
- Les funcions estàtiques poden ser virtuals?
- Comparació de la paraula clau estàtica en C++ i Java
- Funcions estàtiques en C