CV reiškia „Constant-Volatile“. Objekto, prieš kurį nenurodytas „const“ ir (arba) nepastovus, deklaravimas yra „cv-nonqualified“ tipas. Kita vertus, objekto, prieš kurį dedamas konst ir / arba nepastovus, deklaravimas yra cv tipo. Jei objektas yra paskelbtas const, jo vietoje esančios vertės pakeisti negalima. Nepastovus kintamasis yra kintamasis, kurio reikšmę veikia programuotojas, todėl kompiliatorius jo negali pakeisti.Saugyklos klasės specifikatoriai nurodo tipo egzistavimo laiką, vietą ir būdą. Saugyklos klasės specifikacijos yra statinės, kintamos, thread_local ir extern.
Šiame straipsnyje paaiškinami „C ++“ kvalifikatoriai ir saugojimo klasės specifikatoriai. Taigi, kai kurios išankstinės žinios C ++ kalba yra naudingos norint iš tikrųjų įvertinti straipsnį.
Straipsnio turinys:
- Kvalifikacijos
- Saugyklos klasės specifikacijos
- Išvada
Kvalifikacijos:
konst
Deklaruotas pastovus objektas yra objektas, kurio vertės saugykla (vieta) negali būti pakeista. Pavyzdžiui, pareiškime:
int const theInt = 5;5 reikšmės „TheInt“ saugykloje pakeisti negalima.
nepastovus
Apsvarstykite šį teiginį:
int portVal = 26904873;Kompiliatoriai kartais trukdo kintamojo vertei tikėdamiesi optimizuoti programą. Kompiliatorius gali išlaikyti kintamojo vertę kaip pastovią, kai manoma, kad ji nėra pastovi. Kompiliatorius gali kištis į objekto reikšmes, susijusias su atmintyje susietais IO prievadais arba pertraukiamų periferinių įrenginių aptarnavimo tvarką. Norėdami išvengti tokių trukdžių, padarykite kintamąjį nepastovų, pvz .:
int nepastovus portVal;portVal = 26904873;
arba kaip:
int nepastovus prievadasVal = 26904873;
Derinant konstanta ir nepastovią:
konstanta ir nepastovi viename sakinyje gali atsirasti taip:
int const nepastovus prievadasVal = 26904873;CV kvalifikacinės varžybos
Kintamasis, prieš kurį nurodomas const ir (arba) nepastovus, yra cv kvalifikuotas tipas. Kintamasis, prieš kurį nenurodytas nei const, nei nepastovus, nei abu, yra nekvalifikuotas CV tipas.
Užsakymas:
Vienas tipas gali būti labiau tinkamas CV nei kitas:
- Nė vienas CV kvalifikatorius nėra mažesnis už konstato kvalifikatorių
- Nė vienas CV kvalifikatorius taip pat nėra mažesnis nei nepastovus kvalifikatorius
- Nė vienas CV kvalifikatorius nėra mažesnis už konstanta nepastovų kvalifikatorių
- const kvalifikatorius yra mažesnis nei const lakus kvalifikatorius
- nepastovus kvalifikatorius yra mažesnis nei konstatuojantis kvalifikatorius
Dar nebuvo padaryta išvada, jei konstanta ir nepastovi yra to paties rango.
Masyvas ir momentinis objektas:
Kai masyvas paskelbiamas pastoviu, kaip nurodyta šiame sakinyje, tai reiškia, kad kiekvieno masyvo elemento vertės negalima pakeisti:
const char arr [] = 'a', 'b', 'c', 'd';Nesvarbu, ar tai „a“, „b“, „c“ ar „d“, jo vis tiek negalima pakeisti į kitą vertę (simbolį).
Panaši situacija taikoma ir momentiniam klasės objektui. Apsvarstykite šią programą:
# įtrauktinaudojant vardų sritį std;
klasė Cla
vieša:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
grąžinti 0;
Dėl teiginio „const Cla obj;“ su „const“ pagrindinėje () funkcijoje, nei „a“, nei „b“, nei „c“, nei „d“ negalima pakeisti kita verte.
Saugyklos klasės specifikacijos:
Saugyklos klasės specifikacijos yra statinės, kintamos, thread_local ir extern.
The statinis laikymo klasės specifikatorius
Statinės saugyklos klasės specifikatorius leidžia kintamajam gyventi po to, kai jo taikymo sritis praeina, tačiau tiesiogiai prie jo negalima prisijungti.
Ši programa iliustruoja tai su rekursine funkcija:
# įtrauktinaudojant vardų sritį std;
int funct ()
statinis int stac = 10;
cout << stac < 50)
cout << '\n';
grąžinti 0;
funct ();
int main ()
funct ();
grąžinti 0;
Rezultatas yra:
10 20 30 40 50Jei statinis kintamasis nėra inicializuojamas jo pirmojoje deklaracijoje, jis prisiima numatytąją savo tipo vertę.
Statinis specifikatorius taip pat gali būti naudojamas su klasės nariais; naudojimas čia yra kitoks. Čia tai leidžia pasiekti narį be akimirkos objektui.
Duomenų nariui tai parodo ši programa:
# įtrauktinaudojant vardų sritį std;
klasė Cla
vieša:
statinis konst int skaičius = 8;
;
int main ()
cout << Cla::num << '\n';
grąžinti 0;
Rezultatas yra:
8Statinių duomenų narys turi būti pastovus. Atminkite, kad srities skiriamosios gebos operatoriaus naudojimas norint pasiekti statinį kintamąjį už jo srities ribų (pagrindinėje funkcijoje).
Ši programa iliustruoja „statinio“ naudojimą nario funkcijai:
# įtrauktinaudojant vardų sritį std;
klasė Cla
vieša:
statinis niekinis metodas ()
cout << "Of static member function!" << '\n';
;
int main ()
Cla :: metodas ();
grąžinti 0;
Rezultatas yra:
Statinio nario funkcijos!
Atkreipkite dėmesį, kad srities skiriamosios gebos operatoriaus naudojimas norint pasiekti statinio nario funkciją už jos taikymo srities ribų (pagrindinėje funkcijoje).
Kintamasis specifikatorius
Iš viršaus atminkite, kad jei momentinis objektas prasideda konst., Bet kurio jo įprasto duomenų nario vertė negali būti pakeista. Kad bet kuris toks duomenų narys būtų pakeistas, jis turi būti paskelbtas kaip keičiamas.
Tai iliustruoja ši programa:
# įtrauktinaudojant vardų sritį std;
klasė Cla
vieša:
char ch0 = 'a';
char ch1 = 'b';
kintama char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
grąžinti 0;
Rezultatas yra:
"a" b "z" d "Gijos_vietos specifikatorius
Įprastai vykdant programą, vykdomas vienas kodo segmentas, tada kitas kodo segmentas, po jo sekantis kitas kodo segmentas ir t. T. Tai yra viena gija; pagrindinis siūlas. Jei du kodo segmentai vykdomi tuo pačiu metu (ta pati trukmė), tada reikalinga antroji gija. Antrojo sriegio rezultatas gali būti net paruoštas prieš pagrindinį sriegį.
Pagrindinė () funkcija yra kaip pagrindinė gija. Tokiam asinchroniniam elgesiui programa gali turėti daugiau nei dvi gijas.
Norint, kad antrasis siūlas veiktų, reikia srities (blokų apimties). Tai paprastai suteikia funkcijos apimtis, funkcija. Kintamasis išorinėje sferoje, kurį galima pamatyti antrosios gijos srityje.
Ši trumpa programa iliustruoja „thread_local“ specifikatoriaus naudojimą:
# įtraukti# įtraukti
naudojant vardų sritį std;
thread_local int inter = 1;
void thread_function ()
inter = inter + 1;
cout << inter << "nd thread\n";
int main ()
gijos metimas (& gijos_funkcija); // thr pradeda bėgti
cout << inter << "st or main thread\n";
thr.prisijungti (); // pagrindinis siūlas laukia, kol siūlas bus baigtas
grąžinti 0;
Rezultatas yra:
1-asis arba pagrindinis siūlas2-as siūlas
Kintamasis „inter“, prieš kurį rašoma „thread_local“, reiškia, kad inter kiekvienoje gijoje turi atskirą egzempliorių. Ir kad jis gali būti modifikuojamas skirtingose gijose, kad būtų skirtingos vertės. Šioje programoje jam priskiriama reikšmė, 1 pagrindinėje gijoje, ir pakeista į vertę, 2 antrojoje gijoje.
Siūlui reikia specialaus objekto, kad jis galėtų veikti. Šioje programoje biblioteka įtraukta į „#include
Specialiojo objekto prisijungimo () nario funkcija, naudodama savo padėtį, priverčia pagrindinį siūlą laukti, kol baigsis antrasis siūlas, kol jis toliau vykdys, kitaip pagrindinė () funkcija gali išeiti be (antrosios) gijos. davė savo rezultatą.
Išorinis specifikatorius
Paprasčiau tariant, deklaracijai atmintis neskiriama kintamajam ar funkcijai, o apibrėžimui - atmintis. Išorinis rezervuotas žodis leidžia visuotinį kintamąjį ar funkciją deklaruoti viename faile, bet apibrėžti kitame. Tokie failai vadinami vertimo vienetais visai C ++ programai.
Įveskite šią programą ir išsaugokite ją naudodami failo pavadinimą, mainFile:
# įtrauktinaudojant vardų sritį std;
int myInt;
const char ch;
anuliuoti myFn ();
int main ()
myFn ();
grąžinti 0;
Kintamasis, myInt, pastovus kintamasis, ch ir funkcija myFn (), buvo deklaruoti neapibrėžti.
Įveskite šią programą su apibrėžimais ir išsaugokite ją failo pavadinimu „otherFile“ tame pačiame kataloge:
# įtrauktinaudojant vardų sritį std;
int myInt = 10;
const char ch = 'c';
anuliuoti myFn ()
cout << "myFn() says " << myInt << " and " << ch <<'\n';
Pabandykite kompiliuoti programą terminale (DOS komandų eilutė) naudodami šią komandą ir atkreipkite dėmesį, kad ji gali nekompiliuoti:
g ++ pagrindinis failas.cpp otherFile.cpp -o baigta.exePrieš tris deklaracijas mainFile su žodžiu „extern“ pateikite taip:
extern int myInt;extern const char ch;
extern void myFn ();
Iš naujo išsaugokite mainFile. Sudarykite programą su:
g ++ pagrindinis failas.cpp otherFile.cpp -o baigta.exe(Taip kompiliuojami atskiri tos pačios programos failai C ++)
Ir tai turėtų sudaryti. Dabar paleiskite programą, užpildykite.exe, o išvestis turėtų būti:
myFn () sako 10 ir cAtkreipkite dėmesį, kad naudojant „extern“, pastovus kintamasis gali būti deklaruojamas viename faile, bet apibrėžtas kitame. Nagrinėjant funkcijų deklaravimą ir apibrėžimą skirtinguose failuose, išorinis naudojimas yra neprivalomas.
Kada naudoti išorę? Naudokite, kai neturite antraštės failų su visuotinėmis deklaracijomis.
„Extern“ taip pat naudojamas su šablonų deklaracijomis - žr. Vėliau.
Išvada:
Kintamasis, prieš kurį nurodomas const ir (arba) nepastovus, yra cv kvalifikuotas tipas. Kintamasis, prieš kurį nenurodytas nei const, nei nepastovus, nei abu, yra CV nekvalifikuotas tipas.
Saugyklos klasės specifikacijos yra statinės, kintamos, thread_local ir extern. Tai turi įtakos kintamųjų naudojimo trukmei (trukmei), vietai ir įdarbinimo būdui programoje.