Voorwaarde: Statische variabelen in C
git pull origin-master
Het statische trefwoord heeft verschillende betekenissen wanneer het met verschillende typen wordt gebruikt. We kunnen statische trefwoorden gebruiken met:
- Statische variabelen: variabelen in een functie, variabelen in een klasse Statische leden van klasse: klasseobjecten en functies in een klasse Laten we nu elk van deze vormen van statisch gebruik in detail bekijken.
Statische variabelen
Statische variabelen in een functie : Wanneer een variabele als statisch wordt gedeclareerd, wordt ruimte voor het wordt toegewezen voor de levensduur van het programma . Zelfs als de functie meerdere keren wordt aangeroepen, wordt de ruimte voor de statische variabele slechts één keer toegewezen en wordt de waarde van de variabele in de vorige aanroep overgedragen via de volgende functieaanroep. Dit is handig voor het implementeren van coroutines in C/C++ of elke andere toepassing waarbij de vorige functiestatus moet worden opgeslagen.
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;> }> |
>
>Uitvoer
0 1 2 3 4>
U kunt in het bovenstaande programma zien dat het aantal variabelen statisch is verklaard. De waarde ervan wordt dus overgedragen via de functieaanroepen. Het aantal variabelen wordt niet elke keer geïnitialiseerd wanneer de functie wordt aangeroepen. Even terzijde: Java staat geen statische lokale variabelen toe in functies .
Statische variabelen in een klasse : Omdat de variabelen die als statisch zijn gedeclareerd, slechts één keer worden geïnitialiseerd omdat ze ruimte toegewezen krijgen in afzonderlijke statische opslag, zijn de statische variabelen in een klasse worden gedeeld door de objecten. Er kunnen niet meerdere kopieën zijn van dezelfde statische variabelen voor verschillende objecten. Om deze reden kunnen statische variabelen ook niet worden geïnitialiseerd met behulp van 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;> }> |
>
>
Uitvoer
undefined reference to `GfG::i' collect2: error: ld returned 1 exit status>
Je kunt in het bovenstaande programma zien dat we hebben geprobeerd meerdere kopieën van de statische variabele i voor meerdere objecten te maken. Maar dit gebeurde niet. Een statische variabele binnen een klasse moet dus expliciet door de gebruiker worden geïnitialiseerd met behulp van de klassenaam en de scope-resolutieoperator buiten de klasse, zoals hieronder weergegeven:
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;> }> |
instantiatie in Java
>
>Uitvoer
1>
Statische leden van de klas
Klasseobjecten als statisch : Net als variabelen hebben objecten, ook als ze als statisch worden gedeclareerd, een bereik tot de levensduur van het programma. Beschouw het onderstaande programma waarin het object niet-statisch is.
C++
voeg array-java toe
// 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
'>;> }> |
>
>Uitvoer
Inside Constructor Inside Destructor End of main>
In het bovenstaande programma wordt het object binnen het if-blok als niet-statisch verklaard. Het bereik van een variabele bevindt zich dus alleen binnen het if-blok. Dus wanneer het object wordt gemaakt, wordt de constructor aangeroepen en zodra de controle over het if-blok over de destructor heen komt, wordt een beroep gedaan op de destructor, aangezien de reikwijdte van het object zich alleen binnen het if-blok bevindt waar het is gedeclareerd. Laten we nu de verandering in de uitvoer bekijken als we het object als statisch declareren.
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
'>;> }> |
>
>Uitvoer
Inside Constructor End of main Inside Destructor>
Je kunt duidelijk de verandering in de output zien. Nu wordt de destructor aangeroepen na het einde van de main. Dit gebeurde omdat de reikwijdte van statische objecten gedurende de hele levensduur van het programma geldt.
Statische functies in een klasse : Net als de statische gegevensleden of statische variabelen binnen de klasse, zijn statische lidfuncties ook niet afhankelijk van het object van de klasse. We mogen een statische ledenfunctie aanroepen met behulp van het object en de operator ‘.’, maar het wordt aanbevolen om de statische leden aan te roepen met behulp van de klassenaam en de operator voor bereikresolutie. Statische lidfuncties hebben alleen toegang tot de statische gegevensleden of andere statische lidfuncties , hebben ze geen toegang tot de niet-statische gegevensleden of lidfuncties van de klasse.
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();> }> |
pete davidson-nationaliteit
>
>Uitvoer
Welcome to GfG!>
Gerelateerde artikelen:
- Quiz over statisch zoekwoord
- Statische gegevensleden in C++
- Wanneer worden statische objecten vernietigd?
- Interessante feiten over statische lidfuncties
- Kunnen statische functies virtueel zijn?
- Vergelijking van statisch trefwoord in C++ en Java
- Statische functies in C