logo

Parola chiave statica in C++

Prerequisito: Variabili statiche in C

fetta di Java

La parola chiave statica ha significati diversi se utilizzata con tipi diversi. Possiamo utilizzare parole chiave statiche con:



    Variabili statiche: variabili in una funzione, variabili in una classe Membri statici della classe: oggetti di classe e funzioni in una classe Esaminiamo ora ciascuno di questi usi di static in dettaglio.

Variabili statiche

Variabili statiche in una funzione : Quando una variabile è dichiarata statica, spazio per viene assegnato per tutta la durata del programma . Anche se la funzione viene chiamata più volte, lo spazio per la variabile statica viene allocato solo una volta e il valore della variabile nella chiamata precedente viene trasferito alla chiamata di funzione successiva. Ciò è utile per implementare le coroutine in C/C++ o qualsiasi altra applicazione in cui è necessario archiviare lo stato precedente della funzione.

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

>

>

Produzione

0 1 2 3 4>

Puoi vedere nel programma sopra che la variabile count è dichiarata statica. Quindi, il suo valore viene trasportato attraverso le chiamate di funzione. Il conteggio delle variabili non viene inizializzato ogni volta che viene chiamata la funzione. Come nota a margine, Java non consente variabili locali statiche nelle funzioni.

Variabili statiche in una classe : Poiché le variabili dichiarate come statiche vengono inizializzate solo una volta poiché viene loro assegnato spazio in una memoria statica separata, anche le variabili statiche in una classe sono condivisi dagli oggetti. Non possono esserci più copie delle stesse variabili statiche per oggetti diversi. Anche per questo motivo le variabili statiche non possono essere inizializzate utilizzando i costruttori.

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

>

>

Produzione

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

Puoi vedere nel programma sopra che abbiamo provato a creare più copie della variabile statica i per più oggetti. Ma questo non è successo. Pertanto, una variabile statica all'interno di una classe deve essere inizializzata esplicitamente dall'utente utilizzando il nome della classe e l'operatore di risoluzione dell'ambito all'esterno della classe, come mostrato di seguito:

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

>

MB in GB
>

Produzione

1>

Membri statici della classe

Oggetti di classe come statici : Proprio come le variabili, anche gli oggetti quando dichiarati statici hanno un ambito fino alla durata del programma. Considera il programma seguente in cui l'oggetto non è statico.

C++


aggiungi a un array in 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 '>;> }>

>

>

Produzione

Inside Constructor Inside Destructor End of main>

Nel programma precedente, l'oggetto viene dichiarato all'interno del blocco if come non statico. Pertanto, l'ambito di una variabile è solo all'interno del blocco if. Pertanto, quando l'oggetto viene creato, viene richiamato il costruttore e non appena il controllo del blocco if supera il distruttore viene richiamato poiché l'ambito dell'oggetto è all'interno del blocco if solo dove viene dichiarato. Vediamo ora il cambiamento nell'output se dichiariamo l'oggetto come statico.

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

>

>

Produzione

Inside Constructor End of main Inside Destructor>

Puoi vedere chiaramente il cambiamento nell'output. Ora il distruttore viene invocato dopo la fine del main. Ciò è accaduto perché l'ambito degli oggetti statici copre l'intera durata del programma.

Funzioni statiche in una classe : Proprio come i membri dati statici o le variabili statiche all'interno della classe, anche le funzioni membro statiche non dipendono dall'oggetto della classe. È consentito invocare una funzione membro statica utilizzando l'oggetto e l'operatore '.', ma si consiglia di invocare i membri statici utilizzando il nome della classe e l'operatore di risoluzione dell'ambito. Le funzioni membro statiche possono accedere solo ai membri dati statici o ad altre funzioni membro statiche , non possono accedere ai membri dati non statici o alle funzioni membro della 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();> }>

>

listnode java

>

Produzione

Welcome to GfG!>

Articoli Correlati:

  • Quiz sulle parole chiave statiche
  • Membri dati statici in C++
  • Quando vengono distrutti gli oggetti statici?
  • Fatti interessanti sulle funzioni membro statiche
  • Le funzioni statiche possono essere virtuali?
  • Confronto tra parole chiave statiche in C++ e Java
  • Funzioni statiche in C