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
- Ladustamise kestus
- Automaatne salvestamise kestus
- Dünaamiline salvestamise kestus
- Staatiline ladustamise kestus
- Keerme hoidmise kestus
- Järeldus
Objekti eluea illustratsioon
Mõelge järgmisele programmile:
# kaasatanimeruumi 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.
# kaasatanimeruumi 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 intSee 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):
# kaasatanimeruumi 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:
# kaasatanimeruumi 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 ():
# kaasatanimeruumi 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:
# kaasatanimeruumi 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:
# kaasatanimeruumi 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:
- 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.
- 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