Ц ++

Животни век објекта и трајање складиштења у Ц ++

Животни век објекта и трајање складиштења у Ц ++
Током креирања објекта, мора се утврдити његово место у меморији, пре него што се покрене. Иницијализација значи стављање вредности на локацију. Животни век објекта започиње одмах након иницијализације. Када објекат умре, његова локација (складиште), коју је предмет заузео, се ослобађа, а затим се рачунар искључује или складиште заузима (користи) други објекат. Ослобађање средства за складиштење, чинећи идентификатор или показивач који је заузимао складиште, неважећим. Животни век предмета се завршава када се ослободи његово складиште.

Потребно је мало времена за стварање предмета. Потребно је неко време да се убије предмет. Када се говори о предмету, укључују се две ствари: локација која је складиште и вредност. Значење живота и трајања складиштења су слични; али трајање се види више са становишта локације него са становишта вредности. Трајање складиштења је време од када је локација придружена неком објекту до тренутка када је локација одвојена од објекта.

Остатак овог чланка илуструје животни век предмета и укратко објашњава различита трајања складиштења. Требали бисте имати основно знање на језику Ц ++ да бисте разумели овај чланак. Такође би требало да имате знање из опсега Ц ++.

Садржај чланка

Илустрација животног века предмета

Размотрите следећи програм:

#инцлуде
коришћење простора имена стд;
инт маин ()

ако (1 == 1)

инт к;
к = 1;
цхар и;
и = 'А';
цоут << x << y << '\n';

ретурн 0;

Излаз је 1А .

Живот предмета се завршава кад изађе из опсега. Животни век објекта к почиње на „к = 1;“ и завршава се на крају иф-лоцал-сцопе. Животни век објекта и почиње на „и = 'А';“ и завршава се на крају иф-лоцал-сцопе. Пре него што оба предмета умру, они су запослени у изјави о рути .

Трајање складиштења

Трајање складиштења одређено је једном од следећих шема: аутоматско трајање складиштења; динамичко трајање складиштења; трајање статичког складиштења; трајање складиштења нити. Категорије трајања складиштења, такође се примењују на референце.

Аутоматско трајање складиштења

Ако променљива није експлицитно декларисана као статичка, нит_локална или екстерна, тада та променљива има аутоматско трајање складиштења. Примери су к и и горе. Трајање таквих променљивих завршава кад изађу из опсега. Следећи програм илуструје аутоматско трајање складиштења за референцу и показивач у глобалном опсегу.

#инцлуде
коришћење простора имена стд;
инт к = 1;
инт & м = к;
цхар и = 'А';
цхар * н = & и;
инт маин ()

цоут << m << *n << '\n';
ретурн 0;

Излаз је 1А .

Трајање м почиње од „инт & м = к;“ а завршава се на крају програма. Трајање н почиње од „цхар * н = & и;“ а завршава се на крају програма.

Динамично трајање складиштења

Бесплатна продавница

У савременом рачунару може истовремено да ради више програма. Сваки програм има свој део меморије. Остатак меморије који не користи ниједан програм познат је под називом фрее сторе. Следећи израз се користи за враћање локације из целог броја из бесплатне продавнице

нови инт

Ова локација (складиште) за цели број, враћена, још увек мора бити идентификована додељивањем показивача. Следећи код илуструје како се користи показивач у бесплатном складишту:

инт * птрИнт = ново инт;
* птрИнт = 12;
цоут<< *ptrInt <<'\n';

Излаз је 12 .

Да бисте ставили тачку на живот објекта, користите израз делете на следећи начин:

делете птрИнт;

Аргумент за израз делете је показивач. Следећи код илуструје његову употребу:

инт * птрИнт = ново инт;
* птрИнт = 12;
делете птрИнт;

Показивач креиран са новим изразом и избрисан с изразом делете има динамичко трајање меморије. Овај показивач умире док излази из опсега или се брише. Трајање објекта у претходном коду почиње са „* птрИнт = 12;“ и завршава се на крају декларативне регије (опсег). Изрази нев и делете имају више него што је овде дискутовано - погледајте касније.

Трајање статичког складиштења

Статички објекат

Објект који је проглашен статичним, понаша се као обични објекат, осим што његово трајање складиштења започиње од тренутка када је иницијализовано до краја програма. Не може се видети изван његовог делокруга, али се индиректно може користити и изван његовог делокруга.

Размотрите следећи програм који би требало да броји од 1 до 5 (не тестирајте програм):

#инцлуде
коришћење простора имена стд;
инт фн ()

инт стц = 1;
цоут << " << stc;
стц = стц + 1;
ако (стц> 5)
ретурн 0;
фн ();

инт маин ()

фн ();
ретурн 0;

Резултат је 1 1 1 1 1 1 1 1 1… и никад се заправо не завршава. Дефиниција функције је понављајућа функција; што значи да се и даље позива док се не испуни услов.

Решење је учинити стц објект статичним. Једном када се статички објекат покрене, његова вредност се не може мењати док се програм не заврши. Следећи програм (који можете тестирати), који је исти као и претходни, али сада са стц израђеним статичким броји од 1 до 5:

#инцлуде
коришћење простора имена стд;
инт фн ()

статички инт стц = 1;
цоут << " << stc;
стц = стц + 1;
ако (стц> 5)
ретурн 0;
фн ();

инт маин ()

фн ();
ретурн 0;

Резултат је: 1 2 3 4 5 .

Напомена: Трајање статичног објекта започиње када је објекат иницијализиран и завршава на крају програма. У међувремену, објекат се може користити индиректно, из другог обима. Једном када се статички објекат покрене, његова почетна вредност не може се променити, чак и ако се његова дефиниција поново процени. У горњем коду, стц се не ресетује, следећи пут када се позове. Следећи пут када се позове, увећава се за „стц = стц + 1;“.

Члан са статичким подацима

Скуп повезаних променљивих и функција може се ставити у генерализовану јединицу која се назива класа. Ако се променљивим дају одређене вредности, класа постаје објект. Међутим, објекат се не ствара само додељивањем вредности променљивој. Класа је инстанцирана да би добила објекат; а сваки створени објекат има своје име различито од осталих објеката исте класе. Следећи програм приказује класу која се назива ТхеЦла и објекат који се зове обј; такође показује како се објект инстанцира и користи у функцији маин ():

#инцлуде
коришћење простора имена стд;
класа ТхеЦла

јавно:
инт нум;
воид фунц (цхар цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
инт маин ()

ТхеЦла обј;
обј.нум = 12;
обј.фунц ('$', "500");
ретурн 0;

Излаз је:

У продавници постоји 12 књига вредних 500 долара.

Приметите, да би променљивој нум требало доделити вредност 12, објекат мора бити инстанциран, пре него што би се додељивање могло извршити. Програмеру је могуће доделити вредност без инстанцирања (креирања) објекта. Да би се то постигло, променљива нум мораће бити декларисана као статична. Тада ће му се приступити као „ТхеЦла :: нум“ без имена објекта, али са именом класе. Следећи програм то илуструје:

#инцлуде
коришћење простора имена стд;
класа ТхеЦла

јавно:
статички цонст инт нум = 12;
воид фунц (цхар цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
инт маин ()

цоут << TheCla::num << '\n';
ТхеЦла обј;
обј.фунц ('$', "500");
ретурн 0;

Излаз је:

12
У продавници постоји 12 књига вредних 500 долара.

Имајте на уму да је за приступ члану података потребно користити нум у маин (), оператору резолуције опсега ::. Такође не да је променљива нум требало да буде константна и иницијализована у опису класе (дефиницији).

Статичка функција члана

Приметите да је у претходном списку програма горе, да би се користила функција фунц у маин (), требало извршити инстанцирање објекта. Програмер је могуће позвати функцију без инстанцирања (креирања) објекта. Да би се то постигло, дефиницији функције мора претходити реч „статички“. Тада ће му се приступити као „ТхеЦла :: фунц ()“ без имена објекта, али са именом класе. Следећи програм илуструје ово за статичке чланове података и функције статичких чланова:

#инцлуде
коришћење простора имена стд;
класа ТхеЦла

јавно:
статички цонст инт нум = 12;
статичка воц функција (цхар цха, цонст цхар * стр)

цоут << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
инт маин ()

ТхеЦла :: фунц ('$', "500");
ретурн 0;

Излаз је:

У продавници постоји 12 књига вредних 500 долара.

Трајање складиштења нити

Нит као особину у Ц ++-у још увек није имплементирао компајлер г ++. Дакле, уместо да се ово објасни, навод из спецификације Ц ++ дат је на следећи начин:

  1. Све променљиве декларисане кључном речи тхреад_лоцал имају трајање складиштења нити. Складиштење за ове ентитете трајаће све док нит у којој су створени. Постоји засебан објекат или референца по нити, а употреба декларисаног имена односи се на ентитет повезан са тренутном нити.
  2. Променљива са трајањем чувања нити ће бити иницијализована пре прве одржања и, ако је конструисана, биће уништена на излазу из нити.”

Закључак

Животни век објекта започиње када је његова иницијализација завршена и завршава се када се ослободи његово складиште. Динамично трајање меморије започиње када се меморија коју је креирао (нови тип) иницијализује, а завршава када објекат излази из опсега или се обрише „показивачем брисања“. Трајање статичног објекта започиње када је објекат иницијализиран и завршава на крају програма. Једном када се статички објекат покрене, његова почетна вредност не може се променити, чак и ако се његова дефиниција поново процени. Члановима статичких података и члановима статичке функције приступа се изван описа класе помоћу „ЦлассНаме :: наме“.

Цхрис

Најбоље игре командне линије за Линук
Командна линија није само ваш највећи савезник када користите Линук - она ​​такође може бити извор забаве јер је можете користити за играње многих заб...
Најбоље апликације за мапирање гамепада за Линук
Ако волите да играте игре на Линуку са гамепадом уместо са типичним системом за унос тастатуре и миша, за вас постоје неке корисне апликације. Многе и...
Корисни алати за Линук играче
Ако волите да играте игре на Линуку, велика је вероватноћа да сте можда користили апликације и услужне програме попут Вине, Лутрис и ОБС Студио за поб...