C ++

C ++ - kvalifikatorer og specifikationer for opbevaringsklasse

C ++ - kvalifikatorer og specifikationer for opbevaringsklasse

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:

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:

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:

#omfatte
ved 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:

#omfatte
ved 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 50

Hvis 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:

#omfatte
ved hjælp af namespace std;
klasse Cla

offentlig:
statisk konst int int = 8;
;
int main ()

cout << Cla::num << '\n';
returnere 0;

Outputtet er:

8

Det 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:

#omfatte
ved 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:

#omfatte
ved 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åd
2. 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 ”Har en klasse kaldet en tråd, hvorfra genstanden thr er blevet instantieret. Konstruktøren til dette objekt tager en henvisning til trådfunktionen som et argument. Navnet på trådfunktionen i dette program er trådfunktion ().

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:

#omfatte
ved 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:

#omfatte
ved 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.exe

Gå 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 c

Bemæ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.

Mus Sådan ændres musemarkør og markørstørrelse, farve og skema på Windows 10
Sådan ændres musemarkør og markørstørrelse, farve og skema på Windows 10
Musemarkøren og markøren i Windows 10 er meget vigtige aspekter af operativsystemet. Dette kan også siges om andre operativsystemer, så i sandhed er d...
Gratis og open source-spilmotorer til udvikling af Linux-spil
Denne artikel dækker en liste over gratis og open source-spilmotorer, der kan bruges til at udvikle 2D- og 3D-spil på Linux. Der er mange sådanne spil...
Shadow of the Tomb Raider til Linux-vejledning
Shadow of the Tomb Raider er den tolvte tilføjelse til Tomb Raider-serien - en action-adventure-spilfranchise oprettet af Eidos Montreal. Spillet blev...