C ++

C ++ kvalifikacijos ir saugojimo klasės specifikacijos

C ++ kvalifikacijos ir saugojimo klasės specifikacijos

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:

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:

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ą:

# įtraukti
naudojant 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:

# įtraukti
naudojant 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 50

Jei 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:

# įtraukti
naudojant vardų sritį std;
klasė Cla

vieša:
statinis konst int skaičius = 8;
;
int main ()

cout << Cla::num << '\n';
grąžinti 0;

Rezultatas yra:

8

Statinių 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:

# įtraukti
naudojant 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:

# įtraukti
naudojant 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ūlas
2-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 “Turi klasę, vadinamą gija, iš kurios objektas thr buvo išaiškintas. Šio objekto konstruktorius nurodo gijos funkciją kaip argumentą. Šios programos gijos funkcijos pavadinimas yra thread_function ().

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:

# įtraukti
naudojant 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:

# įtraukti
naudojant 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.exe

Prieš 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 c

Atkreipkite 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.

5 geriausios žaidimų fiksavimo kortos
Visi mes matėme ir pamėgome srautinius žaidimus „YouTube“. „PewDiePie“, „Jakesepticye“ ir „Markiplier“ yra tik vieni iš geriausių žaidėjų, kurie uždir...
Kaip sukurti žaidimą „Linux“
Prieš dešimtmetį nedaugelis „Linux“ vartotojų numatė, kad jų mėgstama operacinė sistema vieną dieną bus populiari komercinių vaizdo žaidimų žaidimų pl...
Atvirojo kodo komercinių žaidimų variklių uostai
Nemokami atvirojo kodo ir įvairių platformų žaidimų varikliai gali būti naudojami žaidžiant senus ir kai kuriuos gana naujus žaidimų pavadinimus. Šiam...