C ++

C ++ kvalifikaatorid ja salvestusklassi spetsifikaatorid

C ++ kvalifikaatorid ja salvestusklassi spetsifikaatorid

CV tähistab Constant-Volatile. Objekti deklaratsioon, millele ei eelne const ja / või volatiil, on cv-kvalifitseerimata tüüp. Teiselt poolt on objekti deklareerimine, millele eelneb konst ja / või volatiil, CV-ga kvalifitseeritud tüüp. Kui objekt on deklareeritud const, ei saa selle asukohas olevat väärtust muuta. Lenduv muutuja on muutuja, mille väärtus on programmeerija mõjul ja seetõttu ei saa koostaja seda muuta.Salvestusklassi spetsifikaatorid viitavad tüübi olemasolule, kohale ja viisile. Salvestusklasside täpsustajad on staatilised, muudetavad, thread_local ja extern.

Selles artiklis selgitatakse C ++ kvalifikaatoreid ja salvestusklassi spetsifikaate. Seega on mõned eelteadmised C ++ keeles artikli tõeliseks hindamiseks kasuks.

Artikli sisu:

Kvalifikatsioonid:

konst

Konstantiks deklareeritud objekt on objekt, mille väärtust (asukohta) ei saa muuta. Näiteks avalduses:

int const theInt = 5;

TheInt-i salvestusruumi väärtust 5 ei saa muuta.

kõikuv

Vaatleme järgmist väidet:

int portVal = 26904873;

Koostajad segavad mõnikord muutuja väärtust lootuses programmi optimeerida. Koostaja võib hoida muutuja väärtuse konstantsena, kui see pole pidev. Objekti väärtusi, mis on seotud mäluga kaardistatud IO-porti või välisseadmete teenuse katkestamist, võib kompilaator häirida. Selliste häirete vältimiseks muutuja muutuvaks, näiteks:

int lenduv portVal;
portVal = 26904873;
või nagu:
int lenduv portVal = 26904873;

Kombineerides konstantse ja lenduva:

konst ja lenduv võib ühes avaldises esineda järgmiselt:

int const lenduv portVal = 26904873;

CV-kvalifikatsioonid

Muutuja, millele eelneb konst ja / või volatiil, on CV-ga kvalifitseeritud tüüp. Muutuja, millele ei eelne ei const ega volatiil ega mõlemad, on CV-kvalifitseerimata tüüp.

Tellimine:

Üks tüüp võib olla CV-ga kvalifitseeritum kui teine:

Siiani ei ole jõutud järeldusele, kas const ja volatiil on sama auastmega.

Massiiv ja kohene objekt:

Kui massiiv kuulutatakse konstantseks, nagu järgmises lauses, tähendab see, et massiivi iga elemendi väärtust ei saa muuta:

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

Olgu see a, b, c või d, ei saa seda siiski mingiks muuks väärtuseks (tähemärgiks) muuta.

Sarnane olukord on klassi eksemplari objektil. Mõelge järgmisele programmile:

# kaasata
nimeruumi kasutamine std;
klass Cla

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

const Cla obj;
tagastama 0;

Väite „const Cla obj;” tõttu funktsiooniga const peamise () korral ei saa a ega b, c, d ega d muuta millekski muuks väärtuseks.

Ladustamisklassi spetsifikatsioonid:

Salvestusklasside täpsustajad on staatilised, muudetavad, thread_local ja extern.

The staatiline salvestusklassi spetsifikatsioon

Staatilise salvestusklassi täpsustaja võimaldab muutujal elada ka pärast selle ulatuse läbimist, kuid sellele ei saa otse juurde pääseda.

Järgmine programm illustreerib seda rekursiivse funktsiooniga:

# kaasata
nimeruumi kasutamine std;
int funct ()

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

cout << '\n';
tagastama 0;

funktsioon ();

int main ()

funktsioon ();
tagastama 0;

Väljund on:

10 20 30 40 50

Kui staatilist muutujat ei initsialiseerita selle esimesel deklaratsioonil, võtab ta oma tüübi vaikeväärtuse.

Staatilist täpsustajat saab kasutada ka klassi liikmetega; siin on kasutamine erinev. Siin võimaldab see liikmele juurde pääseda ilma objekti viivitamata.

Järgmine programm illustreerib seda andmeliikme jaoks:

# kaasata
nimeruumi kasutamine std;
klass Cla

avalik:
staatiline konst int arv = 8;
;
int main ()

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

Väljund on:

8

Staatiline andmeliige peab olema konstantne. Pange tähele, et ulatuseralduse operaatori kasutamine staatilisele muutujale juurdepääsu saamiseks väljaspool selle reguleerimisala (põhifunktsioonis).

Järgmine programm illustreerib “staatilise” kasutamist liikme funktsiooni jaoks:

# kaasata
nimeruumi kasutamine std;
klass Cla

avalik:
staatiline void meetod ()

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

;
int main ()

Cla :: meetod ();
tagastama 0;

Väljund on:

Staatilise liikme funktsiooniga!

Pange tähele, et ulatuseralduse operaatori kasutamine staatilise liikme funktsioonile juurdepääsuks väljaspool selle reguleerimisala (põhifunktsioonis).

Muutuv spetsifikaator

Pidage ülevalt meeles, et kui eksemplari objekt algab tähega const, ei saa selle ühegi tavalise andmeliikme väärtust muuta. Ja iga sellise andmeliikme muutmiseks tuleb see kuulutada muutuvaks.

Järgmine programm illustreerib seda:

# kaasata
nimeruumi kasutamine std;
klass Cla

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

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

Väljund on:

"a" b "z" d "

Keerme_kohalik täpsustaja

Programmi tavapärase töötamise korral käivitatakse üks koodisegment, seejärel järgmine koodisegment, millele järgneb teine ​​koodisegment jne. See on üks niit; peamine niit. Kui kaks koodilõiku käivitatakse korraga (sama kestusega), on vaja teist lõime. Teise lõime tulemus võib olla isegi enne peaniiti valmis.

Põhifunktsioon () on nagu põhilõng. Programmil võib sellise asünkroonse käitumise jaoks olla rohkem kui kaks lõime.

Teine lõim vajab toimimiseks ulatust (ploki ulatust). Seda pakub tavaliselt funktsiooni ulatus, funktsioon. Muutuja välises ulatuses, mida saab näha teise lõime ulatuses.

Järgmine lühike programm illustreerib thread_local spetsifikaatori kasutamist:

# kaasata
# kaasata
nimeruumi kasutamine std;
lõime_kohaline int inter = 1;
void thread_function ()

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

int main ()

lõime thr (& lõime_funktsioon); // thr hakkab jooksma
cout << inter << "st or main thread\n";
thr.liitu (); // peamine niit ootab lõime, thr lõpeb
tagastama 0;

Väljund on:

1. või peamine niit
2. lõng

Muutuja inter, millele eelneb thread_local, tähendab, et inter-il on igas lõimes eraldi eksemplar. Ja et seda saab erinevates lõimedes muuta, et sellel oleksid erinevad väärtused. Selles programmis määratakse sellele väärtus, 1 põhilõimes ja muudetakse väärtuseks, 2 teises lõimes.

Lõng vajab toimimiseks spetsiaalset objekti. Selle programmi jaoks lisati teeki väljale „#include ”On klass, mida nimetatakse niidiks, millest objekt thr on kiirendatud. Selle objekti konstruktor võtab argumendina viite lõime funktsioonile. Selle programmi lõimefunktsiooni nimi on thread_function ().

Spetsiaalse objekti liitumisfunktsioon () selle kasutatavas asendis paneb peaniidi ootama, kuni teine ​​lõim on lõpetatud, enne kui see jätkab, vastasel juhul võib funktsioon pea () väljuda ilma (teise) lõimeta andis oma tulemuse.

Väline täpsustaja

Lihtsamalt öeldes, deklaratsiooni jaoks ei eraldata muutuja või funktsiooni jaoks mälu, samas kui definitsiooni jaoks eraldatakse mälu. Väline reserveeritud sõna võimaldab ühes failis deklareerida globaalse muutuja või funktsiooni, kuid teises määratleda. Selliseid faile nimetatakse kogu C ++ rakenduse tõlkeüksusteks.

Sisestage järgmine programm ja salvestage see failinimega mainFile:

# kaasata
nimeruumi kasutamine std;
int myInt;
const char ch;
void myFn ();
int main ()

myFn ();
tagastama 0;

Muutuja myInt, konstantmuutuja ch ja funktsioon myFn () on deklareeritud määratlemata.

Sisestage järgmine programm koos definitsioonidega ja salvestage see failinimega otherFile samasse kataloogi:

# kaasata
nimeruumi kasutamine std;
int myInt = 10;
const char ch = 'c';
void myFn ()

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

Proovige terminalis (DOS-i käsureal) kompileerida järgmine käsk ja märkige, et see ei pruugi kompileerida:

g ++ peafail.cpp muuFail.cpp -o täielik.exe

Nüüd eelneb mainFile'i kolmele deklaratsioonile sõnaga "extern" järgmiselt:

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

Salvestage mainFile uuesti. Koostage rakendus järgmisega:

g ++ peafail.cpp muuFail.cpp -o täielik.exe

(Nii koostatakse C ++ -s sama rakenduse eraldi failid)

Ja see peaks koostama. Nüüd käivitage rakendus, täitke.exe ja väljund peaks olema:

myFn () ütleb 10 ja c

Pange tähele, et "extern" kasutamisel saab konstantse muutuja deklareerida ühes failis, kuid defineerida teises. Funktsioonide deklaratsiooni ja määratluse käsitlemisel erinevates failides on extern'i kasutamine vabatahtlik.

Millal kasutada externit? Kasutage seda siis, kui teil pole ülddeklaratsioonidega päisefaile.

“Extern” kasutatakse ka malldeklaratsioonidega - vt hiljem.

Järeldus:

Muutuja, millele eelneb konst ja / või volatiil, on CV-ga kvalifitseeritud tüüp. Muutuja, millele ei eelne ei const ega volatiil ega mõlemad, on CV-tingimusteta tüüp.

Salvestusklasside täpsustajad on staatilised, muudetavad, thread_local ja extern. Need mõjutavad muutujate eluiga (kestus), kohta ja rakendamise viisi rakenduses.

Kommertsmängumootorite avatud lähtekoodiga sadamad
Tasuta, avatud lähtekoodiga ja platvormidevaheliste mängumootorite puhkusereise saab kasutada nii vanade kui ka mõnede üsna hiljutiste mängude pealkir...
Parimad Linuxi käsurea mängud
Käsurida pole Linuxi kasutamisel lihtsalt teie suurim liitlane - see võib olla ka meelelahutusallikas, sest saate seda kasutada paljude lõbusate mängu...
Parimad Linuxi mängupuldi kaardistamise rakendused
Kui teile meeldib mängida Linuxis mänge tavalise klaviatuuri ja hiire sisestussüsteemi asemel mängupuldiga, on teie jaoks mõned kasulikud rakendused. ...