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
- Uzglabāšanas ilgums
- Automātisks uzglabāšanas ilgums
- Dinamisks uzglabāšanas ilgums
- Statiskais uzglabāšanas ilgums
- Vītnes uzglabāšanas ilgums
- Secinājums
Objekta kalpošanas ilustrācija
Apsveriet šādu programmu:
# iekļautizmantojot 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ļautizmantojot 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ļautizmantojot 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ļautizmantojot 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ļautizmantojot 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ļautizmantojot 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ļautizmantojot 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:
- 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.
- 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