C ++

Objekti eluiga ja salvestamise kestus C ++

Objekti eluiga ja salvestamise kestus C ++
Objekti loomisel tuleb enne initsialiseerimist kindlaks teha selle asukoht mälus. Initsialiseerimine tähendab asukoha väärtuse lisamist. Objekti eluiga algab vahetult pärast lähtestamist. Kui objekt sureb, vabastatakse selle asukoht (salvestusruum), mille hõivatud objekt hõivab, ja seejärel arvuti seiskatakse või salvestusruumi võtab (kasutab) mõni teine ​​objekt. Salvestusruumi vabastamine tähendab, et mäluruumi hõivanud identifikaatori või kursori kehtetuks muutmine. Objekti eluiga lõpeb, kui selle salvestusruum vabastatakse.

Objekti loomiseks on vaja mõnda aega. Eseme tapmiseks on vaja mõnda aega. Objektist rääkides on seotud kaks asja: asukoht, mis on salvestusruum, ja väärtus. Eluea ja ladustamise kestuse tähendus on sarnane; kuid kestust nähakse pigem asukoha kui väärtuse seisukohast. Salvestamise kestus on aeg alates objekti seostamisest hetkeni, kui asukoht objektist lahutatakse.

Selle artikli ülejäänud osa illustreerib objekti eluiga ja selgitab lühidalt erinevaid hoiustamise kestusi. Selle artikli mõistmiseks peaksite omama algteadmisi C ++ keeles. Teil peaks olema ka teadmisi C ++ ulatusest.

Artikli sisu

Objekti eluea illustratsioon

Mõelge järgmisele programmile:

# kaasata
nimeruumi kasutamine std;
int main ()

kui (1 == 1)

int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';

tagastama 0;

Väljundiks on 1A .

Objekti elu saab otsa, kui see väljub reguleerimisalast. Objekti x eluiga algab väärtusest „x = 1;” ja lõpeb if-local-ulatuse lõpus. Objekti y eluiga algab väärtusest “y =” A ”; ja lõpeb if-local-ulatuse lõpus. Enne mõlema objekti surma kasutatakse neid cout-avalduses .

Ladustamise kestus

Salvestusaja kestus määratakse ühe järgmise skeemi abil: automaatne salvestamise kestus; dünaamilise salvestamise kestus; staatiline salvestamise kestus; niidi salvestamise kestus. Salvestusaja kestuse kategooriad kehtivad ka viidetele.

Automaatne salvestamise kestus

Kui muutujat ei deklareerita selgesõnaliselt staatilise, lõime_kohaliku või välisena, on selle muutuja automaatne salvestamise kestus. Näiteks x ja y eespool. Selliste muutujate kestus lõpeb, kui need reguleerimisalast välja lähevad. Järgmine programm illustreerib viite ja osuti automaatse salvestamise kestust globaalses ulatuses.

# kaasata
nimeruumi kasutamine std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
tagastama 0;

Väljundiks on 1A .

M kestus algab „int & m = x;” ja lõpeb programmi lõpus. N kestus algab „char * n = & y;” ja lõpeb programmi lõpus.

Dünaamiline salvestamise kestus

Tasuta pood

Kaasaegses arvutis võib korraga töötada mitu programmi. Igal programmil on oma osa mälust. Ülejäänud mälu, mida ükski programm ei kasuta, nimetatakse vabapoeks. Järgmist lauset kasutatakse tasuta poe täisarvu asukoha tagastamiseks

uus int

See tagastatud täisarvu asukoht (salvestusruum) tuleb ikkagi osutada kursori määramise abil. Järgmine kood illustreerib, kuidas osutit tasuta poega kasutada:

int * ptrInt = uus int;
* ptrInt = 12;
cout<< *ptrInt <<'\n';

Väljund on 12 .

Objekti eluea lõpetamiseks kasutage kustutusavaldust järgmiselt:

kustuta ptrInt;

Avaldise kustutamise argument on osuti. Selle kasutamist illustreerib järgmine kood:

int * ptrInt = uus int;
* ptrInt = 12;
kustuta ptrInt;

Uue avaldisega loodud ja kustutava avaldisega kustutatud kursori mälu kestus on dünaamiline. See kursor sureb, kui see reguleerimisalast välja läheb, või kustutatakse. Eelmises koodis oleva objekti kestus algab „* ptrInt = 12;” ja lõpeb deklaratiivse piirkonna lõpus (ulatus). Uutesse ja kustutatavatesse väljenditesse mahub rohkem, kui siin arutletud on - vt hiljem.

Staatiline ladustamise kestus

Staatiline objekt

Staatiliseks kuulutatud objekt käitub nagu tavaline objekt, välja arvatud see, et selle salvestamise kestus algab selle initsialiseerimisest kuni programmi lõpuni. Seda ei saa näha väljaspool selle reguleerimisala, kuid seda saab kaudselt kasutada väljaspool oma reguleerimisala.

Mõelge järgmisele programmile, mis peaks loendama vahemikus 1 kuni 5 (ärge katsetage programmi):

# kaasata
nimeruumi kasutamine std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
kui (stc> 5)
tagastama 0;
fn ();

int main ()

fn ();
tagastama 0;

Väljund on 1 1 1 1 1 1 1 1 ... ja tegelikult ei lõpe kunagi. Funktsiooni määratlus on korduv funktsioon; see tähendab, et ta kutsub end pidevalt, kuni mõni tingimus on täidetud.

Lahendus on muuta stc objekt staatiliseks. Kui staatiline objekt on initsialiseeritud, ei saa selle väärtust enne programmi lõppu muuta. Järgmist programmi (mida saate testida), mis on sama, mis ülaltoodud, kuid nüüd staatilise stc-ga, loendatakse vahemikus 1 kuni 5:

# kaasata
nimeruumi kasutamine std;
int fn ()

staatiline int stc = 1;
cout << " << stc;
stc = stc + 1;
kui (stc> 5)
tagastama 0;
fn ();

int main ()

fn ();
tagastama 0;

Väljund on: 1 2 3 4 5 .

Märkus. Staatilise objekti kestus algab pärast objekti initsialiseerimist ja lõpeb programmi lõpus. Seniks saab objekti kasutada kaudselt, erinevast ulatusest. Kui staatiline objekt on initsialiseeritud, ei saa selle algväärtust muuta, isegi kui selle definitsiooni hinnatakse uuesti. Ülaltoodud koodis stc ei lähtestata, järgmisel korral seda kutsutakse. Järgmisel korral, kui seda kutsutakse, suurendatakse seda väärtusega „stc = stc + 1;”.

Staatiliste andmete liige

Seotud muutujate ja funktsioonide komplekti saab panna üldistatud üksusesse, mida nimetatakse klassiks. Kui muutujatele antakse teatud väärtused, saab klass objektiks. Objekti ei looda aga lihtsalt muutujale väärtuste määramisega. Klass on eseme saamiseks objekti saamiseks; ja igal loodud objektil on oma nimi, mis erineb teistest sama klassi objektidest. Järgmine programm näitab klassi nimega TheCla ja objekti nimega obj; see näitab ka seda, kuidas objekt instantiseeritakse ja kasutatakse funktsioonis main ():

# kaasata
nimeruumi kasutamine std;
klass TheCla

avalik:
int number;
tühine func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla obj;
obj.arv = 12;
obj.func ('$', "500");
tagastama 0;

Väljund on:

Poes on 12 raamatut väärtuses 500 dollarit.

Pange tähele, et muutujale 12 väärtuse määramiseks peab objekt olema enne määramise toimumist kiirendatud. Programmeerijal on võimalik omistada väärtus ilma objekti loomata (loomata). Selle saavutamiseks tuleb muutuja num arv staatiliseks deklareerida. Siis pöördutakse sellele kui "TheCla :: num" ilma objekti nimeta, kuid koos klassi nimega. Järgmine programm illustreerib seda:

# kaasata
nimeruumi kasutamine std;
klass TheCla

avalik:
staatiline konst int arv = 12;
tühine func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

cout << TheCla::num << '\n';
TheCla obj;
obj.func ('$', "500");
tagastama 0;

Väljund on:

12
Poes on 12 raamatut väärtuses 500 dollarit.

Pange tähele, et andmeliikme juurde pääsemiseks tuli kasutada num in main (), ulatuse eraldamise operaator ::. Samuti mitte see, et muutuja num tuleks muuta konstantseks ja lähtestada klassi kirjelduses (määratlus).

Staatilise liikme funktsioon

Pange tähele, et eelmises ülaltoodud programmiloendis tuli funktsiooni func kasutamiseks main () -is objekt objektida. Programmeerijal on võimalik funktsiooni kutsuda ilma objekti loomata (loomata). Selle saavutamiseks peab funktsiooni määratlusele eelnema sõna „staatiline”. Siis pöördutakse sellele kui "TheCla :: func ()" ilma objekti nimeta, kuid klassi nimega. Järgmine programm illustreerib seda staatilise andmeliikme ja staatilise liikme funktsiooni puhul:

# kaasata
nimeruumi kasutamine std;
klass TheCla

avalik:
staatiline konst int arv = 12;
staatiline tühine func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla :: func ('$', "500");
tagastama 0;

Väljund on:

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Keerme säilitamise kestus

Teema C ++ funktsioonina pole g ++ kompilaator veel rakendanud. Niisiis, selle selgitamise asemel antakse tsitaat C ++ spetsifikatsioonist järgmiselt:

  1. Kõigil märksõnaga thread_local deklareeritud muutujatel on lõime salvestamise kestus. Nende üksuste salvestusruum kestab kogu lõime vältel, milles need on loodud. Lõime kohta on eraldi objekt või viide ja deklareeritud nime kasutamine viitab praeguse lõimega seotud olemile.
  2. Keerme salvestusajaga muutuja initsialiseeritakse enne selle esimest kasutamist, kui see on loodud, ja hävitatakse niidi väljumisel.”

Järeldus

Objekti eluiga algab siis, kui selle lähtestamine on lõppenud, ja lõpeb siis, kui selle salvestusruum vabastatakse. Dünaamiline salvestusaja kestus algab (uue tüübi) loodud salvestusruumi initsialiseerimisel ja lõpeb, kui objekt väljub reguleerimisalast või kustutatakse „kustuta kursor”. Staatilise objekti kestus algab pärast objekti initsialiseerimist ja lõpeb programmi lõpus. Kui staatiline objekt on initsialiseeritud, ei saa selle algväärtust muuta, isegi kui selle definitsiooni hinnatakse uuesti. Staatiliste andmeliikmete ja staatiliste funktsioonide liikmete juurde pääseb väljaspool klassi kirjeldust, kasutades „ClassName :: name”.

Chrys

Parimad mängud, mida saab mängida käte jälgimisega
Oculus Quest tutvustas hiljuti suurepärast ideed käsitsi jälgimisest ilma kontrolleriteta. Üha suurema hulga mängude ja tegevustega, mis toetavad kas ...
Kuidas kuvada OSD ülekatet täisekraanil Linuxi rakendustes ja mängudes
Täisekraaniga mängude mängimine või rakenduste kasutamine häireteta täisekraanirežiimis võib teid paneelil või tegumiribal kuvatavast asjakohasest süs...
Viis parimat mängu püüdmise kaarti
Me kõik oleme YouTube'is voogesituse mänge näinud ja armastanud. PewDiePie, Jakesepticye ja Markiplier on vaid mõned tipptasemel mängijatest, kes on t...