CV står for Constant-Volatile. Erklæringen af et objekt, der ikke er forud for const og / eller flygtige, er en cv-ukvalificeret type. På den anden side er erklæringen af et objekt, der er forud for const og / eller flygtig, en cv-kvalificeret type. Hvis et objekt erklæres const, kan værdien i dets placering ikke ændres. En flygtig variabel er en variabel, hvis værdi er under indflydelse af programmøren og derfor ikke kan ændres af kompilatoren.Opbevaringsklassespecifikatorer henviser til det liv, sted og den måde, hvorpå en type findes. Lagerklasse-specifikationer er statiske, mutable, thread_local og eksterne.
Denne artikel forklarer C ++ - kvalifikatorer og Storage Class Specifiers. Således kommer nogle foreløbige viden i C ++ til nytte for virkelig at værdsætte artiklen.
Artikelindhold:
- Kvalifikationer
- Lagerklasse-specifikationer
- Konklusion
Kvalifikationer:
konst
Et objekt, der er erklæret konstant, er et objekt, hvis lager (placering), hvis værdi ikke kan ændres. For eksempel i erklæringen:
int const theInt = 5;Værdien af 5 i lageret til theInt kan ikke ændres.
flygtige
Overvej følgende udsagn:
int portVal = 26904873;Compilere forstyrrer undertiden værdien af en variabel med håb om at optimere programmet. Compileren kan opretholde værdien af en variabel som konstant, når den ikke formodes at være konstant. Objektværdier, der har at gøre med hukommelseskortede IO-porte eller Interrupt Service Routines for perifere enheder, kan forstyrres af compileren. For at forhindre sådan interferens skal du gøre variablen flygtig, som:
int flygtig portVal;portVal = 26904873;
eller lignende:
int flygtig portVal = 26904873;
Kombinerer konst og flygtig:
const og flygtige kan forekomme i en sætning som følger:
int const flygtig portVal = 26904873;cv-kvalifikationer
En variabel forud for const og / eller flygtige er en cv-kvalificeret type. En variabel, der ikke er forud for hverken const eller flygtig eller begge dele, er en cv-ukvalificeret type.
Bestilling:
En type kan være mere cv-kvalificeret end en anden:
- Ingen cv-kvalifikation er mindre end en const-kvalifikation
- Ingen cv-kvalifikator er også mindre end en ustabil kvalifikation
- Ingen cv-kvalifikator er mindre end en const-flygtig kvalifikator
- const-kvalifikator er mindre end en const-flygtig kvalifikator
- flygtig kvalifikator er mindre end en konst-flygtig kvalifikator
Det er endnu ikke konkluderet, om konst og flygtige er af samme rang.
Array og Instantiated Object:
Når en matrix erklæres konstant, som i følgende udsagn, betyder det, at værdien af hvert element i arrayet ikke kan ændres:
const char arr [] = 'a', 'b', 'c', 'd';Uanset om det er et 'a', 'b', 'c' eller 'd', kan det stadig ikke ændres til en anden værdi (tegn).
En lignende situation gælder for et instantieret objekt fra en klasse. Overvej følgende program:
#omfatteved hjælp af namespace std;
klasse Cla
offentlig:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
returnere 0;
På grund af udsagnet “const Cla obj;” med const i hovedfunktionen () kan hverken 'a' eller 'b' eller 'c' eller 'd' ændres til en anden værdi.
Opbevaringsklassespecifikatorer:
Lagerklasse-specifikationer er statiske, mutable, thread_local og eksterne.
Det statisk specifikation for lagerklasse
Specifikatoren for statisk opbevaringsklasse tillader variablen at leve, efter at dens omfang er gennemgået, men den kan ikke åbnes direkte.
Følgende program illustrerer dette med en rekursiv funktion:
#omfatteved hjælp af namespace std;
int funkt ()
statisk int stac = 10;
cout << stac < 50)
cout << '\n';
returnere 0;
funct ();
int main ()
funct ();
returnere 0;
Outputtet er:
10 20 30 40 50Hvis en statisk variabel ikke initialiseres ved den første erklæring, antager den standardværdien for sin type.
Den statiske specifikator kan også bruges med medlemmer af en klasse; brugen her er anderledes. Her giver det adgang til medlemmet uden genstand for objektet.
Følgende program illustrerer dette for et datamedlem:
#omfatteved hjælp af namespace std;
klasse Cla
offentlig:
statisk konst int int = 8;
;
int main ()
cout << Cla::num << '\n';
returnere 0;
Outputtet er:
8Det statiske data-medlem skal være konstant. Bemærk, at brugen af omfangsopløsningsoperatøren til at få adgang til den statiske variabel uden for dens anvendelsesområde (i hovedfunktionen).
Følgende program illustrerer brugen af “statisk” til en medlemsfunktion:
#omfatteved hjælp af namespace std;
klasse Cla
offentlig:
statisk ugyldig metode ()
cout << "Of static member function!" << '\n';
;
int main ()
Cla :: metode ();
returnere 0;
Outputtet er:
Af statisk medlemsfunktion!
Bemærk, at brugen af omfangsopløsningsoperatøren til at få adgang til den statiske medlemsfunktion uden for dens anvendelsesområde (i hovedfunktionen).
Den ændrede specifikator
Husk ovenfra, at hvis et instantieret objekt begynder med const, kan værdien af et af dets normale data-medlemmer ikke ændres. Og for at et sådant datamedlem skal ændres, skal det erklæres, ændres.
Følgende program illustrerer dette:
#omfatteved hjælp af namespace std;
klasse Cla
offentlig:
char ch0 = 'a';
char ch1 = 'b';
mutable char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
returnere 0;
Outputtet er:
'a "b" z "d'Thread_local Specifier
I den normale kørsel af et program udføres et kodesegment, derefter det næste kodesegment efterfulgt af et andet kodesegment efter det osv. Det er en tråd; hovedtråden. Hvis to kodesegmenter udføres på samme tid (samme varighed), er der brug for en anden tråd. Resultatet af den anden tråd kan endda være klar før hovedtråden.
Hovedfunktionen () er som hovedtråden. Et program kan have mere end to tråde til en sådan asynkron opførsel.
Den anden tråd har brug for et omfang (blokområde) for at fungere. Dette leveres typisk af funktionsomfanget, en funktion. En variabel i et ydre omfang, der kan ses i omfanget af den anden tråd.
Følgende korte program illustrerer brugen af thread_local-specifikatoren:
#omfatte#omfatte
ved hjælp af namespace std;
thread_local int inter = 1;
ugyldig tråd_funktion ()
inter = inter + 1;
cout << inter << "nd thread\n";
int main ()
tråd thr (& tråd_funktion); // thr begynder at køre
cout << inter << "st or main thread\n";
thr.tilslutte(); // hovedtråd venter på tråden, thr til slut
returnere 0;
Outputtet er:
1. eller hovedtråd2. tråd
Variablen, inter, forud for thread_local, betyder, at inter har en separat forekomst i hver tråd. Og at det kan ændres i forskellige tråde for at have forskellige værdier. I dette program tildeles den værdien, 1 i hovedtråden og ændres til værdien, 2 i den anden tråd.
En tråd har brug for et specielt objekt for at kunne fungere. For dette program inkluderet biblioteket af “#include
Join () -elementfunktionen for det specielle objekt, ved sin anvendte position, får hovedtråden til at vente på, at den anden tråd er færdig med at blive udført, før den fortsætter med at udføre, ellers kan hovedfunktionen () muligvis afslutte uden at (den anden) tråd har gav sit resultat.
Den eksterne specifikator
Enkelt sagt tildeles hukommelse ikke til variablen eller funktionen til en erklæring, mens hukommelsen tildeles til en definition. Det eksterne reserverede ord tillader, at en global variabel eller funktion erklæres i en fil, men defineres i en anden. Sådanne filer kaldes oversættelsesenheder til den komplette C ++ - applikation.
Skriv følgende program, og gem det med filnavnet, mainFile:
#omfatteved hjælp af namespace std;
int myInt;
const char ch;
ugyldig myFn ();
int main ()
myFn ();
returnere 0;
Variablen, myInt, den konstante variabel, ch og funktionen, myFn (), er blevet deklareret uden at være defineret.
Skriv følgende program med definitionerne, og gem det med filnavnet, otherFile, i samme bibliotek:
#omfatteved hjælp af namespace std;
int myInt = 10;
const char ch = 'c';
ugyldig myFn ()
cout << "myFn() says " << myInt << " and " << ch <<'\n';
Prøv at kompilere applikationen ved terminalen (DOS-kommandoprompt) med følgende kommando, og bemærk at den muligvis ikke kompileres:
g ++ hovedfil.cpp andetFil.cpp -o komplet.exeGå nu foran de tre erklæringer i mainFile med ordet “extern” som følger:
ekstern int mynt;ekstern konst char char;
eksternt ugyldigt myFn ();
Gem mainFile igen. Kompilér applikationen med:
g ++ hovedfil.cpp andetFil.cpp -o komplet.exe(Sådan kompileres separate filer til samme applikation i C ++)
Og det skal kompilere. Kør nu applikationen, komplet.exe, og output skal være:
myFn () siger 10 og cBemærk, at ved brug af “extern” kan en konstant variabel deklareres i en fil, men defineres i en anden. Når der behandles funktionserklæring og definition i forskellige filer, er brugen af extern valgfri.
Hvornår skal du bruge ekstern? Brug det, når du ikke har headerfiler med globale erklæringer.
“Ekstern” bruges også med skabelondeklarationer - se senere.
Konklusion:
En variabel forud for const og / eller flygtige er en cv-kvalificeret type. En variabel, der ikke er forud for hverken const eller flygtig eller begge dele, er en cv-ukvalificeret type.
Lagerklasse-specifikationer er statiske, mutable, thread_local og eksterne. Disse påvirker levetiden (varighed), sted og beskæftigelsesmåde for variabler i en applikation.