C ++

Objekta kalpošanas laiks un uzglabāšanas ilgums C ++

Objekta kalpošanas laiks un uzglabāšanas ilgums C ++
Veidojot objektu, pirms tā inicializācijas ir jānosaka tā atrašanās vieta atmiņā. Inicializācija nozīmē vērtības ievietošanu vietā. Objekta kalpošanas laiks sākas tieši pēc inicializācijas. Kad objekts mirst, tiek atbrīvota tā atrašanās vieta (krātuve), kuru aizņemtais objekts, un pēc tam dators tiek izslēgts vai krātuve tiek izmantota (izmantota) citam objektam. Krātuves atbrīvošana nozīmē, ka identifikatoru vai rādītāju, kas aizņēma krātuvi, padara nederīgu. Objekta kalpošanas laiks beidzas, kad tiek atbrīvota tā krātuve.

Objekta izveidošanai vajadzīgs zināms laiks. Ir vajadzīgs zināms laiks, lai nogalinātu objektu. Runājot par objektu, tiek iesaistītas divas lietas: vieta, kas ir krātuve, un vērtība. Dzīves ilguma un uzglabāšanas ilguma nozīme ir līdzīga; bet ilgums vairāk tiek skatīts no atrašanās vietas, nevis no vērtības. Uzglabāšanas ilgums ir laiks no brīža, kad atrašanās vieta ir saistīta ar objektu, līdz brīdim, kad atrašanās vieta ir norobežota no objekta.

Šī raksta atlikums ilustrē objekta kalpošanas laiku un īsi izskaidro dažādos uzglabāšanas ilgumus. Lai saprastu šo rakstu, jums vajadzētu būt pamatzināšanām C ++ valodā. Jums vajadzētu būt arī zināšanām C ++ jomā.

Raksta saturs

Objekta kalpošanas ilustrācija

Apsveriet šādu programmu:

# iekļaut
izmantojot nosaukumvietu std;
int main ()

ja (1 == 1)

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

atgriešanās 0;

Rezultāts ir 1A .

Objekta dzīve beidzas, kad tā iziet no darbības jomas. Objekta x kalpošanas laiks sākas ar “x = 1;” un beidzas if-local-darbības jomas beigās. Objekta y kalpošanas laiks sākas ar “y =“ A ”;” un beidzas if-local darbības jomas beigās. Pirms abi objekti nomirst, viņi tiek izmantoti cout paziņojumā .

Uzglabāšanas ilgums

Uzglabāšanas ilgumu nosaka viena no šīm shēmām: automātiskās uzglabāšanas ilgums; dinamiskās uzglabāšanas ilgums; statiskās uzglabāšanas ilgums; pavedienu uzglabāšanas ilgums. Uzglabāšanas ilguma kategorijas attiecas arī uz atsaucēm.

Automātisks uzglabāšanas ilgums

Ja mainīgais nav tieši deklarēts kā statisks, thread_local vai extern, tad šim mainīgajam ir automātiskās glabāšanas ilgums. Piemēri ir x un y virs. Šādu mainīgo ilgums beidzas, kad tie iziet no darbības jomas. Šī programma ilustrē atsauces un rādītāja automātiskās glabāšanas ilgumu pasaules mērogā.

# iekļaut
izmantojot nosaukumvietu std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
atgriešanās 0;

Rezultāts ir 1A .

M ilgums sākas no “int & m = x;” un beidzas programmas beigās. N ilgums sākas ar “char * n = & y;” un beidzas programmas beigās.

Dinamisks uzglabāšanas ilgums

Bezmaksas veikals

Mūsdienu datorā vienlaikus var darboties vairāk nekā viena programma. Katrai programmai ir sava atmiņas daļa. Pārējā atmiņa, kuru neizmanto neviena programma, ir pazīstama kā bezmaksas veikals. Lai atgrieztu vesela skaitļa atrašanās vietu no bezmaksas veikala, tiek izmantota šī izteiksme

jauns int

Šī atgrieztā veselā skaitļa vieta (krātuve) joprojām ir jāidentificē, piešķirot rādītājam. Šis kods parāda, kā izmantot rādītāju ar bezmaksas krātuvi:

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

Rezultāts ir 12 .

Lai izbeigtu objekta dzīvi, izmantojiet dzēšanas izteicienu šādi:

dzēst ptrInt;

Izteikuma dzēšanas arguments ir rādītājs. Šis kods parāda tā izmantošanu:

int * ptrInt = jauns int;
* ptrInt = 12;
dzēst ptrInt;

Rādītājam, kas izveidots ar jauno izteiksmi un izdzēsts ar izdzēšanas izteiksmi, ir dinamiskas uzglabāšanas ilgums. Šis rādītājs mirst, kad tas iziet no darbības jomas, vai tiek izdzēsts. Objekta ilgums iepriekšējā kodā sākas ar “* ptrInt = 12;” un beidzas deklaratīvā reģiona beigās (darbības joma). Jaunajiem un izdzēstajiem izteicieniem ir vairāk nekā šeit apspriests - skatiet vēlāk.

Statiskais uzglabāšanas ilgums

Statiskais objekts

Objekts, kas pasludināts par statisku, rīkojas tāpat kā parasts objekts, izņemot to, ka tā uzglabāšanas ilgums sākas no tā inicializācijas līdz programmas beigām. To nevar redzēt ārpus tā darbības jomas, bet to var netieši izmantot arī ārpus tā darbības jomas.

Apsveriet šādu programmu, kuras skaitīšana ir no 1 līdz 5 (nepārbaudiet programmu):

# iekļaut
izmantojot nosaukumvietu std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
ja (stc> 5)
atgriešanās 0;
fn ();

int main ()

fn ();
atgriešanās 0;

Rezultāts ir 1 1 1 1 1 1 1 1 ... un nekad nebeidzas. Funkcijas definīcija ir periodiska funkcija; tas nozīmē, ka tā turpina sevi saukt, līdz tiek izpildīts kāds nosacījums.

Risinājums ir padarīt stc objektu statisku. Kad statiskais objekts ir inicializēts, tā vērtību nevar mainīt, līdz programma beidzas. Šī programma (kuru varat pārbaudīt), kas ir tāda pati kā iepriekš, bet tagad ar statisku statīvu tiek skaitīta no 1 līdz 5:

# iekļaut
izmantojot nosaukumvietu std;
int fn ()

statiskā int stc = 1;
cout << " << stc;
stc = stc + 1;
ja (stc> 5)
atgriešanās 0;
fn ();

int main ()

fn ();
atgriešanās 0;

Rezultāts ir: 1 2 3 4 5 .

Piezīme: Statiskā objekta ilgums sākas, kad objekts ir inicializēts, un beidzas programmas beigās. Tikmēr objektu var izmantot netieši, no citas darbības jomas. Kad statiskais objekts ir inicializēts, tā sākotnējo vērtību nevar mainīt, pat ja tā definīcija tiek pārvērtēta. Iepriekš minētajā kodā stc netiek atiestatīts, nākamreiz to izsaucot. Nākamreiz, kad to izsauks, tas tiks palielināts ar “stc = stc + 1;”.

Statisko datu biedrs

Saistīto mainīgo un funkciju kopu var ievietot vispārinātā vienībā, ko sauc par klasi. Ja mainīgajiem tiek piešķirtas noteiktas vērtības, klase kļūst par objektu. Tomēr objekts netiek izveidots, vienkārši piešķirot mainīgajam vērtības. Klase tiek instantificēta, lai iegūtu objektu; un katram izveidotajam objektam ir savs nosaukums, kas atšķiras no citiem tās pašas klases objektiem. Šī programma parāda klasi ar nosaukumu TheCla un objektu ar nosaukumu obj; tas arī parāda, kā objekts tiek instantēts un izmantots galvenajā () funkcijā:

# iekļaut
izmantojot nosaukumvietu std;
klase TheCla

publiski:
int num;
void func (char cha, const char * str)

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

;
int main ()

TheCla obj;
obj.skaitlis = 12;
obj.func ('$', "500");
atgriešanās 0;

Rezultāts ir:

Veikalā ir 12 grāmatas 500 USD vērtībā.

Ievērojiet - lai piešķirtu mainīgajam skaitlim vērtību 12, objekts ir jāpieradina, pirms varētu notikt piešķiršana. Programmētājam ir iespējams piešķirt vērtību, neveidojot (neizveidojot) objektu. Lai to panāktu, mainīgais lielums num būs jādeklarē kā statisks. Tad tam varēs piekļūt kā “TheCla :: num” bez objekta nosaukuma, bet ar klases nosaukumu. To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
klase TheCla

publiski:
statiskā konst int num = 12;
void 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");
atgriešanās 0;

Rezultāts ir:

12
Veikalā ir 12 grāmatas 500 USD vērtībā.

Ņemiet vērā, ka, lai piekļūtu datu dalībniekam, bija jāizmanto num in main (), darbības jomas izšķirtspējas operators ::. Arī tas, ka mainīgais, num bija jāpadara nemainīgs un inicializēts klases aprakstā (definīcija).

Statiskā locekļa funkcija

Ievērojiet, ka iepriekšējā programmu sarakstā, lai izmantotu funkciju func main (), objekts bija jāpieradina. Programmētājam ir iespējams izsaukt funkciju, nepieradinot (neizveidojot) objektu. Lai to panāktu, pirms funkcijas definīcijas ir jābūt vārdam “statisks”. Tad tam varēs piekļūt kā “TheCla :: func ()” bez objekta nosaukuma, bet ar klases nosaukumu. Šī programma ilustrē to statisko datu dalībnieka un statiskā locekļa funkcijai:

# iekļaut
izmantojot nosaukumvietu std;
klase TheCla

publiski:
statiskā konst int num = 12;
static void func (čar cha, const char * str)

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

;
int main ()

TheCla :: func ('$', "500");
atgriešanās 0;

Rezultāts ir:

Veikalā ir 12 grāmatas 500 USD vērtībā.

Vītnes uzglabāšanas ilgums

G ++ kompilators vēl nav ieviesis pavedienu kā C ++ funkciju. Tātad tā vietā, lai to izskaidrotu, citāts no C ++ specifikācijas tiek sniegts šādi:

  1. Visiem mainīgajiem, kas deklarēti ar thread_local atslēgvārdu, ir pavedienu glabāšanas ilgums. Šo entītiju krātuve ilgst visu pavedienu, kurā tās ir izveidotas. Katram pavedienam ir atšķirīgs objekts vai atsauce, un deklarētā nosaukuma izmantošana attiecas uz entītiju, kas saistīta ar pašreizējo pavedienu.
  2. Mainīgo ar vītnes uzglabāšanas ilgumu inicializē pirms tā pirmās lietošanas reizes, ja tas ir izveidots, to iznīcina, izejot no vītnes.”

Secinājums

Objekta kalpošanas laiks sākas, kad tā ir pabeigta, un beidzas, kad tā tiek atbrīvota. Dinamiskās krātuves ilgums sākas, kad tiek inicializēta (jaunā veida) izveidotā krātuve, un beidzas, kad objekts iziet no darbības jomas vai tiek izdzēsts ar “dzēst rādītāju”. Statiskā objekta ilgums sākas, kad objekts ir inicializēts, un beidzas programmas beigās. Kad statiskais objekts ir inicializēts, tā sākotnējo vērtību nevar mainīt, pat ja tā definīcija tiek pārvērtēta. Statisko datu dalībniekiem un statisko funkciju dalībniekiem var piekļūt ārpus klases apraksta ar “ClassName :: name”.

Chrys

HD Remastered spēles operētājsistēmai Linux, kurām nekad agrāk nebija Linux laidiena
Daudzi spēļu izstrādātāji un izdevēji nāk klajā ar veco spēļu HD remaster, lai pagarinātu franšīzes darbības laiku. Lūdzu, faniem, kas pieprasa saderī...
Kā izmantot AutoKey, lai automatizētu Linux spēles
AutoKey ir darbvirsmas automatizācijas lietderība operētājsistēmām Linux un X11, kas ieprogrammēta Python 3, GTK un Qt. Izmantojot skriptu un MACRO fu...
Kā parādīt FPS skaitītāju Linux spēlēs
Linux spēles ieguva lielu impulsu, kad Valve 2012. gadā paziņoja par Linux atbalstu Steam klientam un viņu spēlēm. Kopš tā laika daudzas AAA un indie ...