C ++

Kvalifikatorji C ++ in specifikacije razreda pomnilnika

Kvalifikatorji C ++ in specifikacije razreda pomnilnika

CV pomeni Constant-Volatile. Deklaracija predmeta, pred katerim ni const in / ali volatile, je cv-nekvalificirana vrsta. Po drugi strani pa je izjava predmeta, pred katerim je const in / ali volatile, vrsta, ki izpolnjuje pogoje za cv. Če je objekt razglašen za const, vrednosti na njegovi lokaciji ni mogoče spremeniti. Hlapljiva spremenljivka je spremenljivka, katere vrednost je pod vplivom programerja, zato je prevajalnik ne more spremeniti.Specifikacije razreda pomnilnika se nanašajo na življenjsko dobo, kraj in način, na katerega tip obstaja. Specifikatorji pomnilniškega razreda so statični, spremenljivi, thread_local in extern.

V tem članku so pojasnjeni kvalifikatorji C ++ in specifikacije razreda pomnilnika. Tako je nekaj predhodnega znanja v jeziku C ++ priročno, da resnično cenim članek.

Vsebina članka:

Kvalifikacije:

const

Objekt, razglašen za konstanto, je objekt, katerega pomnilnika (lokacije) vrednosti ni mogoče spremeniti. Na primer, v izjavi:

int const theInt = 5;

Vrednosti 5 v pomnilniku za theInt ni mogoče spremeniti.

hlapljivo

Upoštevajte naslednjo izjavo:

int portVal = 26904873;

Prevajalniki včasih posegajo v vrednost spremenljivke z upanjem, da bodo program optimizirali. Prevajalnik lahko vrednost spremenljivke ohranja kot konstantno, kadar naj ne bi bila konstantna. Prevajalnik lahko moti vrednosti predmetov, ki so povezane s pomnilniško preslikanimi vhodnimi vrati IO ali s prekinitvami rutin storitev perifernih naprav. Če želite preprečiti takšne motnje, spremenljivko spremenite, kot je:

int volatile portVal;
portVal = 26904873;
ali všeč:
int volatile portVal = 26904873;

Kombinacija const in hlapnosti:

const in volatile se lahko pojavita v enem stavku, kot sledi:

int const volatile portVal = 26904873;

cv-kvalifikacije

Spremenljivka, pred katero je const in / ali volatile, je cv-kvalificiran tip. Spremenljivka, pred katero ni const ali volatile ali pa oboje, je cv-nekvalificiran tip.

Naročanje:

Ena vrsta je lahko bolj cv kvalificirana kot druga:

Še ni zaključeno, ali sta const in volatile enakega ranga.

Matrika in primerek:

Ko je matrika razglašena za konstanto, kot v naslednjem stavku, to pomeni, da vrednosti vsakega elementa matrike ni mogoče spremeniti:

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

Ne glede na to, ali gre za 'a', 'b', 'c' ali 'd', je še vedno ni mogoče spremeniti v neko drugo vrednost (znak).

Podobna situacija velja za primerek predmeta razreda. Upoštevajte naslednji program:

#include
uporaba imenskega prostora std;
razred Cla

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

const Cla obj;
vrnitev 0;

Zaradi izjave "const Cla obj;" s const v funkciji main () niti 'a' niti 'b' niti 'c' niti 'd' ni mogoče spremeniti v drugo vrednost.

Specifikacije razreda pomnilnika:

Specifikatorji pomnilniškega razreda so statični, spremenljivi, thread_local in extern.

The statični specifikacija razreda pomnilnika

Specifikator statičnega razreda pomnilnika omogoča, da spremenljivka živi po preteku obsega, vendar do nje ni mogoče neposredno dostopati.

Naslednji program to ponazarja z rekurzivno funkcijo:

#include
uporaba imenskega prostora std;
int funct ()

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

cout << '\n';
vrnitev 0;

funct ();

int main ()

funct ();
vrnitev 0;

Rezultat je:

10 20 30 40 50

Če statična spremenljivka ni inicializirana ob prvi deklaraciji, prevzame privzeto vrednost za svoj tip.

Statični specifikator se lahko uporablja tudi s člani razreda; uporaba tukaj je drugačna. Tu omogoča članu dostop do predmeta brez instanciranja.

Naslednji program to ponazarja za podatkovnega člana:

#include
uporaba imenskega prostora std;
razred Cla

javno:
statična const int num = 8;
;
int main ()

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

Rezultat je:

8

Član statičnih podatkov mora biti konstanten. Upoštevajte, da uporaba operaterja ločljivosti obsega za dostop do statične spremenljivke zunaj njenega obsega (v glavni funkciji).

Naslednji program ponazarja uporabo funkcije "static" za funkcijo člana:

#include
uporaba imenskega prostora std;
razred Cla

javno:
metoda statične praznine ()

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

;
int main ()

Cla :: method ();
vrnitev 0;

Rezultat je:

Funkcije statičnega člana!

Upoštevajte, da je uporaba operaterja ločljivosti obsega za dostop do funkcije statičnega člana zunaj njegovega obsega (v glavni funkciji).

Spremenljiv specifikator

Od zgoraj ne pozabite, da če se instancirani objekt začne s const, vrednosti katerega koli običajnega podatkovnega člana ni mogoče spremeniti. In za spremembo katerega koli takega podatkovnega člana ga je treba razglasiti za spremenljivega.

Naslednji program to ponazarja:

#include
uporaba imenskega prostora std;
razred Cla

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

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

Rezultat je:

"a" b "z" d '

Specifikator nit_lokal

Pri običajnem zagonu programa se izvede en kodni segment, nato naslednji kodni segment, ki mu sledi še en kodni segment itd. To je ena nit; glavna nit. Če se dva segmenta kode izvajata hkrati (enako traja), je potrebna druga nit. Rezultat druge niti je morda celo pripravljen pred glavno nitjo.

Funkcija main () je kot glavna nit. Program ima lahko več kot dve niti za tako asinhrono vedenje.

Druga nit za delovanje potrebuje obseg (obseg bloka). To običajno zagotavlja obseg funkcije, funkcija. Spremenljivka v zunanjem obsegu, ki je vidna v obsegu druge niti.

Naslednji kratek program ponazarja uporabo specifikatorja thread_local:

#include
#include
uporaba imenskega prostora std;
thread_local int inter = 1;
void thread_function ()

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

int main ()

nit thr (& thread_function); // thr se začne izvajati
cout << inter << "st or main thread\n";
thr.pridruži se (); // glavna nit čaka, da se nit konča
vrnitev 0;

Rezultat je:

1. ali glavna nit
2. nit

Spremenljivka inter, pred katero je thread_local, pomeni, da ima inter v vsaki niti ločen primerek. In da ga je mogoče spremeniti v različnih nitih, da ima različne vrednosti. V tem programu mu je dodeljena vrednost 1 v glavni niti in spremenjena vrednost 2 v drugi niti.

Za delovanje niti potrebuje poseben objekt. Za ta program je knjižnica, vključena v »#include "Ima razred, imenovan nit, iz katerega je bil ustvarjen primer thr. Konstruktor za ta objekt kot argument vzame sklic na funkcijo niti. Ime funkcije niti v tem programu je thread_function ().

Funkcija člana join () za posebni objekt na njegovem položaju povzroči, da glavna nit počaka, da se druga nit zaključi z izvajanjem, preden se nadaljuje z izvajanjem, sicer lahko funkcija main () izstopi, ne da bi (druga) nit imela je dala svoj rezultat.

Zunanji specifikator

Preprosto povedano, za izjavo pomnilnik ni dodeljen spremenljivki ali funkciji, medtem ko je za definicijo dodeljen pomnilnik. Zunanja rezervirana beseda omogoča deklariranje globalne spremenljivke ali funkcije v eni datoteki, definiranje pa v drugi. Takšne datoteke se imenujejo prevajalske enote za celotno aplikacijo C ++.

Vnesite naslednji program in ga shranite z imenom datoteke mainFile:

#include
uporaba imenskega prostora std;
int myInt;
const char ch;
void myFn ();
int main ()

myFn ();
vrnitev 0;

Spremenljivka myInt, spremenljivka konstante ch in funkcija myFn () so bile razglašene, ne da bi bile definirane.

Vnesite naslednji program z definicijami in ga shranite z imenom datoteke, otherFile, v isti imenik:

#include
uporaba imenskega prostora std;
int myInt = 10;
const char ch = 'c';
void myFn ()

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

Poskusite sestaviti aplikacijo na terminalu (ukazni poziv DOS) z naslednjim ukazom in opazite, da morda ne bo prevedena:

g ++ glavna datoteka.cpp otherFile.cpp -o popoln.exe

Zdaj pred tremi izjavami v mainFile pišite z besedo "extern", kot sledi:

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

Ponovno shranite mainFile. Sestavite aplikacijo z:

g ++ glavna datoteka.cpp otherFile.cpp -o popoln.exe

(Tako se v C ++ zbirajo ločene datoteke za isto aplikacijo)

In bi se moral sestaviti. Zdaj zaženite aplikacijo, dokončajte.exe, rezultat pa mora biti:

myFn () pravi 10 in c

Upoštevajte, da lahko z uporabo "extern" spremenljivko konstante prijavite v eni datoteki, definirate pa v drugi. Pri obravnavi izjave in definicije funkcije v različnih datotekah uporaba externa ni obvezna.

Kdaj uporabiti zunanjo? Uporabite ga, če nimate datotek z glavo z globalnimi deklaracijami.

"Extern" se uporablja tudi z izjavami o predlogah - glej kasneje.

Zaključek:

Spremenljivka, pred katero je const in / ali volatile, je cv-kvalificiran tip. Spremenljivka, pred katero ni const ali volatile ali oboje, je cv-nekvalificiran tip.

Specifikatorji pomnilniškega razreda so statični, spremenljivi, thread_local in extern. Ti vplivajo na življenjsko dobo (trajanje), kraj in način uporabe spremenljivk v aplikaciji.

S temi brezplačnimi orodji dodajte gibe miške v sistem Windows 10
V zadnjih letih so se računalniki in operacijski sistemi močno razvili. Včasih so morali uporabniki uporabljati ukaze za krmarjenje po upraviteljih da...
Nadzirajte in upravljajte gibanje miške med več monitorji v sistemu Windows 10
Upravitelj miške z dvojnim zaslonom vam omogoča nadzor in konfiguriranje gibanja miške med več monitorji, tako da upočasni gibanje blizu meje. Windows...
WinMouse vam omogoča prilagajanje in izboljšanje premikanja kazalca miške v računalniku z operacijskim sistemom Windows
Če želite izboljšati privzete funkcije kazalca miške, uporabite brezplačno programsko opremo WinMouse. Dodaja več funkcij, s pomočjo katerih boste kar...