C ++

C ++ Kvalifiserings- og lagerklassespesifikatorer

C ++ Kvalifiserings- og lagerklassespesifikatorer

CV står for Constant-Volatile. Erklæringen om et objekt som ikke går foran const og / eller flyktig er en cv-ukvalifisert type. På den annen side er erklæringen om et objekt som er innledet av const og / eller flyktig, en cv-kvalifisert type. Hvis et objekt blir erklært const, kan ikke verdien på plasseringen endres. En flyktig variabel er en variabel hvis verdi er under innflytelse fra programmereren, og kan derfor ikke endres av kompilatoren.Lagerklasse spesifikatorer refererer til livet, stedet og måten en type eksisterer på. Lagerklasse-spesifikatorer er statisk, muterbar, trådlokal og ekstern.

Denne artikkelen forklarer C ++ - kvalifiserings- og lagerklassespesifikatorer. Dermed kommer noen foreløpige kunnskaper i C ++ godt med å virkelig sette pris på artikkelen.

Artikkelinnhold:

Kvalifikasjoner:

konst

Et objekt som er erklært konstant, er et objekt lagring (plassering) av hvis verdi ikke kan endres. For eksempel i uttalelsen:

int const theInt = 5;

Verdien på 5 i lagringen for theInt kan ikke endres.

flyktige

Tenk på følgende utsagn:

int portVal = 26904873;

Kompilatorer forstyrrer noen ganger verdien av en variabel i håp om å optimalisere programmet. Kompilatoren kan opprettholde verdien av en variabel som konstant når den ikke skal være konstant. Objektverdier som har å gjøre med minnekartede IO-porter, eller Interrupt Service Routines for perifere enheter, kan forstyrres av kompilatoren. For å forhindre slik forstyrrelse, gjør variabelen flyktig, som:

int flyktig portVal;
portVal = 26904873;
eller som:
int flyktig portVal = 26904873;

Kombinere konst og flyktig:

const og flyktig kan forekomme i en uttalelse som følger:

int const flyktig portVal = 26904873;

cv-kvalifiseringer

En variabel foran const og / eller flyktig er en cv-kvalifisert type. En variabel som ikke er foregått med verken const eller flyktig eller begge deler er en cv-ukvalifisert type.

Bestilling:

En type kan være mer cv-kvalifisert enn en annen:

Det er ennå ikke konkludert om konst og ustabil er av samme rang.

Array og Instantiated Object:

Når en matrise blir erklært konstant, som i følgende uttalelse, betyr det at verdien til hvert element i matrisen ikke kan endres:

const char arr [] = 'a', 'b', 'c', 'd';

Enten det er en 'a', 'b', 'c' eller 'd', kan den fortsatt ikke endres til en annen verdi (tegn).

En lignende situasjon gjelder for et instantiert objekt fra en klasse. Tenk på følgende program:

#inkludere
bruker navneområde std;
klasse Cla

offentlig:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()

const Cla obj;
retur 0;

På grunn av uttalelsen “const Cla obj;” med const i hovedfunksjonen (), kan verken 'a' eller 'b' eller 'c' eller 'd' endres til en annen verdi.

Lagringsklasse spesifikatorer:

Lagerklasse-spesifikatorer er statisk, muterbar, trådlokal og ekstern.

De statisk spesifikasjon for lagringsklasse

Den spesifikke spesifikatoren for statisk lagring tillater variabelen å leve etter at omfanget har gått gjennom, men den er ikke tilgjengelig direkte.

Følgende program illustrerer dette, med en rekursiv funksjon:

#inkludere
bruker navneområde std;
int funct ()

statisk int stac = 10;
cout << stac < 50)

cout << '\n';
retur 0;

funct ();

int main ()

funct ();
retur 0;

Utgangen er:

10 20 30 40 50

Hvis en statisk variabel ikke initialiseres ved den første erklæringen, antar den standardverdien for sin type.

Den statiske spesifikatoren kan også brukes med medlemmer av en klasse; bruken her er annerledes. Her gjør det mulig å få tilgang til medlemmet uten instantiering for objektet.

Følgende program illustrerer dette for et datamedlem:

#inkludere
bruker navneområde std;
klasse Cla

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

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

Utgangen er:

8

Det statiske data-medlemmet må være konstant. Legg merke til at bruken av operatøren for omfangsoppløsning for å få tilgang til den statiske variabelen utenfor omfanget (i hovedfunksjonen).

Følgende program illustrerer bruken av “statisk” for en medlemsfunksjon:

#inkludere
bruker navneområde std;
klasse Cla

offentlig:
statisk ugyldig metode ()

cout << "Of static member function!" << '\n';

;
int main ()

Cla :: metode ();
retur 0;

Utgangen er:

Av statisk medlemsfunksjon!

Merk at bruken av operatøren for omfangsoppløsning for å få tilgang til den statiske medlemsfunksjonen utenfor omfanget (i hovedfunksjonen).

Den foranderlige spesifikatoren

Husk ovenfra at hvis et instantiert objekt begynner med const, kan ikke verdien av noen av dets normale data-medlemmer endres. Og for at et slikt data-medlem skal endres, må det erklæres som foranderlig.

Følgende program illustrerer dette:

#inkludere
bruker navneområde 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';
retur 0;

Utgangen er:

'a "b" z "d'

Trådlokal spesifikator

I normal kjøring av et program kjøres ett kodesegment, deretter neste kodesegment, etterfulgt av et annet kodesegment etter det, og så videre. Det er en tråd; hovedtråden. Hvis to kodesegmenter utføres samtidig (samme varighet), er det nødvendig med en annen tråd. Resultatet av den andre tråden kan til og med være klar før hovedtråden.

Hovedfunksjonen () er som hovedtråden. Et program kan ha mer enn to tråder for en slik asynkron oppførsel.

Den andre tråden trenger et omfang (blokkomfang) for å kunne fungere. Dette er vanligvis gitt av funksjonsomfanget, en funksjon. En variabel i et ytre omfang som kan sees i omfanget av den andre tråden.

Følgende korte program illustrerer bruken av thread_local-spesifikatoren:

#inkludere
#inkludere
bruker navneområde std;
thread_local int inter = 1;
ugyldig tråd_funksjon ()

inter = inter + 1;
cout << inter << "nd thread\n";

int main ()

tråd thr (& tråd_funksjon); // thr begynner å løpe
cout << inter << "st or main thread\n";
thr.bli med(); // hovedtråd venter på tråden, thr til slutt
retur 0;

Utgangen er:

1. eller hovedtråd
2. tråd

Variabelen, inter, innledet av thread_local, betyr at inter har en separat forekomst i hver tråd. Og at den kan modifiseres i forskjellige tråder for å ha forskjellige verdier. I dette programmet tildeles den verdien, 1 i hovedtråden, og endres til verdien, 2 i den andre tråden.

En tråd trenger et spesielt objekt for å kunne fungere. For dette programmet inkluderes biblioteket av “#include ”Har en klasse som kalles en tråd, som objektet thr har blitt instantiert fra. Konstruktøren for dette objektet tar en referanse til trådfunksjonen som et argument. Navnet på trådfunksjonen i dette programmet er thread_function ().

Join () -medlemfunksjonen for det spesielle objektet, ved sin posisjon, får hovedtråden til å vente på at den andre tråden skal fullføres før den fortsetter å utføre, ellers kan hoved () -funksjonen gå ut uten at (andre) tråden ga sitt resultat.

Den eksterne spesifikatoren

Enkelt sagt, for en erklæring tildeles ikke minne for variabelen eller funksjonen, mens for en definisjon tildeles minne. Det eksterne reserverte ordet gjør at en global variabel eller funksjon kan deklareres i en fil, men defineres i en annen. Slike filer kalles oversettelsesenheter for hele C ++ - applikasjonen.

Skriv inn følgende program og lagre det med filnavnet, mainFile:

#inkludere
bruker navneområde std;
int myInt;
const char ch;
ugyldig myFn ();
int main ()

myFn ();
retur 0;

Variabelen, myInt, den konstante variabelen, ch og funksjonen, myFn (), er deklarert uten å være definert.

Skriv inn følgende program med definisjonene, og lagre det med filnavnet, otherFile, i samme katalog:

#inkludere
bruker navneområde std;
int myInt = 10;
const char ch = 'c';
ugyldig myFn ()

cout << "myFn() says " << myInt << " and " << ch <<'\n';

Prøv å kompilere applikasjonen på terminalen (DOS ledetekst) med følgende kommando, og legg merke til at den kanskje ikke kompilerer:

g ++ hovedfil.cpp annetFil.cpp -o komplett.exe

Gå nå foran de tre erklæringer i hovedfil med ordet “ekstern”, som følger:

ekstern int mynt;
ekstern const char ch;
eksternt tomrom myFn ();

Lagre mainFile på nytt. Kompiler applikasjonen med:

g ++ hovedfil.cpp annetFil.cpp -o komplett.exe

(Slik kompileres separate filer for samme applikasjon i C ++)

Og det skal kompilere. Kjør nå applikasjonen, fullført.exe, og utgangen skal være:

myFn () sier 10 og c

Merk at ved bruk av “ekstern” kan en konstant variabel deklareres i en fil, men defineres i en annen. Når du arbeider med funksjonserklæring og definisjon i forskjellige filer, er bruk av extern valgfri.

Når skal du bruke ekstern? Bruk den når du ikke har headerfiler med globale erklæringer.

“Ekstern” brukes også med malerklæringer - se senere.

Konklusjon:

En variabel foran const og / eller flyktig er en cv-kvalifisert type. En variabel, ikke forut for hverken const eller flyktig eller begge deler, er en cv-ukvalifisert type.

Lagerklasse-spesifikatorer er statisk, muterbar, trådlokal og ekstern. Disse påvirker levetiden (varighet), sted og ansettelsesmåte for variabler i en applikasjon.

Hvordan vise OSD-overlegg i fullskjerm Linux-apper og spill
Å spille fullskjermspill eller bruke apper i distraksjonsfri fullskjermmodus kan avskrekke deg fra relevant systeminformasjon som er synlig i et panel...
Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...
Hvordan utvikle et spill på Linux
For et tiår siden ville ikke mange Linux-brukere forutsi at deres favorittoperativsystem en dag ville være en populær spillplattform for kommersielle ...