C ++

C ++ kvalifikatori i specifikacije klase pohrane

C ++ kvalifikatori i specifikacije klase pohrane

CV je skraćenica od Constant-Volatile. Deklaracija objekta kojem ne prethodi const i / ili volatile je cv-nekvalificirani tip. S druge strane, deklaracija objekta kojem prethodi const i / ili hlapljiv je cv kvalificirani tip. Ako je objekt proglašen const, vrijednost na njegovom mjestu ne može se mijenjati. Hlapljiva varijabla je varijabla čija je vrijednost pod utjecajem programera i stoga je prevodilac ne može mijenjati.Specifikacije klase skladišta odnose se na život, mjesto i način na koji tip postoji. Specifikatori klase pohrane su statični, promjenjivi, thread_local i extern.

Ovaj članak objašnjava kvalifikatore C ++ i specifikacije klase pohrane. Dakle, neko preliminarno znanje o jeziku C ++ dobro će doći da biste zaista cijenili članak.

Sadržaj članka:

Kvalifikacije:

konst

Objekt koji je deklariran je objekt čija se pohrana (lokacija) vrijednosti ne može mijenjati. Na primjer, u izjavi:

int const theInt = 5;

Vrijednost 5 u pohrani za theInt ne može se promijeniti.

hlapljiv

Razmotrite sljedeću izjavu:

int portVal = 26904873;

Prevoditelji se ponekad miješaju u vrijednost varijable s nadom u optimizaciju programa. Kompajler može vrijednost varijable održavati konstantnom kada ne bi trebala biti konstantna. Kompajler može ometati vrijednosti objekata koje imaju veze s IO priključcima preslikanim memorijom ili rutinama prekida usluga perifernih uređaja. Da biste spriječili takve smetnje, učinite varijablu hlapljivom, poput:

int volatile portVal;
portVal = 26904873;
ili poput:
int hlapljivi portVal = 26904873;

Kombinirajući const i volatile:

const i volatile mogu se pojaviti u jednoj izjavi kako slijedi:

int const hlapljivi portVal = 26904873;

cv-kvalifikacije

Varijabla kojoj prethodi const i / ili hlapljiva vrsta je kvalificirana za cv. Varijabla kojoj nije prethodio const ili volatile ili obje su cv-nekvalificirani tip.

Naručivanje:

Jedna vrsta može biti kvalificiranija za cv od druge:

Još nije zaključeno jesu li const i volatile isti rang.

Niz i instancirani objekt:

Kada je niz proglašen konstantom, kao u sljedećem izrazu, to znači da se vrijednost svakog elementa niza ne može mijenjati:

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

Bez obzira radi li se o 'a', 'b', 'c' ili 'd', i dalje se ne može promijeniti u neku drugu vrijednost (znak).

Slična se situacija odnosi na instancirani objekt klase. Razmotrite sljedeći program:

#include
pomoću prostora imena std;
razred Cla

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

const Cla obj;
return 0;

Zbog izjave "const Cla obj;" s const u funkciji main (), niti 'a', niti 'b', niti 'c' niti 'd' ne mogu se promijeniti u neku drugu vrijednost.

Specifikacije klase pohrane:

Specifikatori klase pohrane su statični, promjenjivi, thread_local i extern.

The statički specifikator klase pohrane

Specifikator statičke klase pohrane omogućuje promjenjivoj postojanje nakon što je opseg prošao, ali ne može joj se pristupiti izravno.

Sljedeći program to ilustrira s rekurzivnom funkcijom:

#include
pomoću prostora imena std;
int funct ()

statički int stac = 10;
cout << stac < 50)

cout << '\n';
return 0;

funct ();

int main ()

funct ();
return 0;

Izlaz je:

10 20 30 40 50

Ako statička varijabla nije inicijalizirana pri svojoj prvoj deklaraciji, ona poprima zadanu vrijednost za svoj tip.

Statički specifikator također se može koristiti s članovima klase; ovdje je upotreba drugačija. Ovdje omogućuje pristup članu bez instanciranja objekta.

Sljedeći program to ilustrira za člana podataka:

#include
pomoću prostora imena std;
razred Cla

javnost:
statički const int num = 8;
;
int main ()

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

Izlaz je:

8

Član statičkog podatka mora biti konstantan. Imajte na umu da upotreba operatora razlučivosti opsega za pristup statičkoj varijabli izvan njenog opsega (u glavnoj funkciji).

Sljedeći program ilustrira upotrebu "static" za funkciju člana:

#include
pomoću prostora imena std;
razred Cla

javnost:
metoda statičke praznine ()

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

;
int main ()

Cla :: metoda ();
return 0;

Izlaz je:

Statičke funkcije člana!

Imajte na umu da upotreba operatora razlučivanja opsega za pristup funkciji statičkog člana izvan njegovog opsega (u glavnoj funkciji).

Promjenjivi Specifikator

Sjetite se, odozgo, da ako instancirani objekt započne s const, vrijednost bilo kojeg od njegovih normalnih članova podataka ne može se mijenjati. A da bi se bilo koji takav član podataka promijenio, on mora biti proglašen promjenjivim.

Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
razred Cla

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

const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
return 0;

Izlaz je:

"a" b "z" d '

Specifikator thread_local

U normalnom pokretanju programa izvršava se jedan segment koda, zatim sljedeći segment koda, nakon toga slijedi drugi segment koda, i tako dalje. To je jedna nit; glavna nit. Ako se dva segmenta koda izvršavaju istovremeno (isto trajanje), tada je potrebna druga nit. Rezultat druge niti može biti spreman i prije glavne niti.

Funkcija main () je poput glavne niti. Program može imati više od dvije niti za takvo asinkrono ponašanje.

Druga nit treba opseg (blok opseg) da bi mogla raditi. To obično osigurava opseg funkcije, funkcija. Varijabla u vanjskom opsegu koja se može vidjeti u opsegu druge niti.

Sljedeći kratki program ilustrira upotrebu specifikatora thread_local:

#include
#include
pomoću prostora imena std;
nit_lokalnog int inter = 1;
prazna funkcija_navoja ()

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

int main ()

nit thr (& thread_function); // thr počinje raditi
cout << inter << "st or main thread\n";
thr.pridružiti(); // glavna nit čeka da nit, thr završi
return 0;

Izlaz je:

1. ili glavna nit
2. nit

Varijabla inter, kojoj prethodi thread_local, znači da inter ima zasebnu instancu u svakoj niti. I da se može modificirati u različitim nitima kako bi imao različite vrijednosti. U ovom programu dodjeljuje joj se vrijednost 1 u glavnoj niti i mijenja se u vrijednost 2 u drugoj niti.

Nit treba poseban objekt da bi mogao raditi. Za ovaj program knjižnica koju uključuje "#include ”Ima klasu koja se naziva nit, iz koje je instanciran objekt thr. Konstruktor za ovaj objekt uzima referencu na funkciju niti kao argument. Naziv funkcije niti u ovom programu je thread_function ().

Funkcija pridruživanja () za posebni objekt, na njegovom položaju, čini da glavna nit čeka da druga nit završi s izvršenjem prije nego što se nastavi izvršavati, u suprotnom, glavna () funkcija može izaći bez da (druga) nit ima dalo je svoj rezultat.

Vanjski specifikator

Jednostavno rečeno, za deklaraciju se memorija ne dodjeljuje za varijablu ili funkciju, dok se za definiciju dodjeljuje memorija. Vanjska rezervirana riječ omogućuje deklariranje globalne varijable ili funkcije u jednoj datoteci, ali definiranje u drugoj. Takve se datoteke nazivaju prijevodnim jedinicama za kompletnu aplikaciju C ++.

Upišite sljedeći program i spremite ga s imenom datoteke mainFile:

#include
pomoću prostora imena std;
int myInt;
const char ch;
poništi myFn ();
int main ()

myFn ();
return 0;

Varijabla myInt, konstanta varijable ch i funkcija myFn () deklarirane su bez definiranja.

Upišite sljedeći program s definicijama i spremite ga s imenom datoteke, otherFile, u isti direktorij:

#include
pomoću prostora imena std;
int myInt = 10;
const char ch = 'c';
poništi myFn ()

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

Pokušajte kompilirati aplikaciju na terminalu (naredbeni redak DOS-a) sa sljedećom naredbom i primijetite da se možda neće kompajlirati:

g ++ glavna datoteka.cpp otherFile.cpp -o dovršen.exe

Sada, ispred tri deklaracije u mainFileu stavite riječ "extern", kako slijedi:

vanjski int myInt;
vanjski const char ch;
extern void myFn ();

Ponovno spremite mainFile. Sastavite prijavu sa:

g ++ glavna datoteka.cpp otherFile.cpp -o dovršen.exe

(Tako se u C ++ kompajliraju zasebne datoteke za istu aplikaciju)

I trebao bi se sastaviti. Sada pokrenite aplikaciju, dovršite.exe, a izlaz bi trebao biti:

myFn () kaže 10 i c

Imajte na umu da se upotrebom "extern" konstantna varijabla može deklarirati u jednoj datoteci, ali definirati u drugoj. Kada se radi o deklaraciji i definiciji funkcije u različitim datotekama, uporaba externa nije obavezna.

Kada koristiti ekstern? Koristite ga kada nemate datoteke zaglavlja s globalnim deklaracijama.

"Extern" se također koristi s deklaracijama predloška - vidi kasnije.

Zaključak:

Varijabla kojoj prethodi const i / ili hlapljiva vrsta je kvalificirana za cv. Varijabla kojoj ne prethodi niti const, niti volatile ili oboje, je cv-nekvalificirani tip.

Specifikatori klase pohrane su statični, promjenjivi, thread_local i extern. Oni utječu na životni vijek (trajanje), mjesto i način zapošljavanja varijabli u aplikaciji.

Pokazivač skače ili se slučajno pomiče dok tipkate u sustavu Windows 10
Ako ustanovite da kursor miša sam skače ili se pomiče automatski, nasumično dok tipkate u Windows prijenosnom računalu ili računalu, neki od ovih prij...
Kako obrnuti smjer pomicanja miša i dodirnih pločica u sustavu Windows 10
Miš i Dodirna pločaRačunarstvo ne samo da olakšava, već i učinkovitije i oduzima puno vremena. Ne možemo zamisliti život bez ovih uređaja, ali činjeni...
Kako promijeniti pokazivač miša i veličinu, boju i shemu pokazivača na sustavu Windows 10
Pokazivač i pokazivač miša u sustavu Windows 10 vrlo su važni aspekti operativnog sustava. To se može reći i za druge operativne sustave, tako da u is...