Ц ++

Квалификатори Ц ++ и спецификације класе складишта

Квалификатори Ц ++ и спецификације класе складишта

ЦВ је скраћеница од Цонстант-Волатиле. Декларација објекта коме не претходи цонст и / или волатиле је цв-неквалификовани тип. С друге стране, декларација објекта коме претходи цонст и / или волатиле је цв квалификовани тип. Ако је објекат проглашен цонст, вредност на његовој локацији не може се променити. Хлапљива променљива је променљива чија је вредност под утицајем програмера и стога је преводилац не може променити.Спецификације класе складишта односе се на живот, место и начин на који тип постоји. Спецификатори класе складишта су статични, променљиви, тхреад_лоцал и ектерн.

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

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

Квалификације:

цонст

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

инт цонст тхеИнт = 5;

Вредност 5 у складишту за тхеИнт не може се променити.

испарљив

Размотрите следећу изјаву:

инт портВал = 26904873;

Преводници се понекад мешају у вредност променљиве са надом у оптимизацију програма. Компајлер може вредност променљиве одржавати константном када не би требало да буде константна. Компајлер може да омета вредности објеката које имају везе са ИО портовима пресликаним меморијом или рутинама прекида услуга периферних уређаја. Да бисте спречили такве сметње, променљиву учините променљивом, попут:

инт волатиле портВал;
портВал = 26904873;
или као:
инт волатиле портВал = 26904873;

Комбинујући цонст и испарљиво:

цонст и волатиле могу се појавити у једној изјави на следећи начин:

инт цонст волатиле портВал = 26904873;

цв-квалификације

Варијабла којој претходи цонст и / или испарљива је врста квалификована за цв. Варијабла којој није претходио ни цонст, ни волатиле или обоје је цв-неквалификовани тип.

Наручивање:

Један тип може бити квалификованији за цв од другог:

Још увек није закључено да ли су цонст и волатиле исти ранг.

Низ и инстанцирани објекат:

Када је низ проглашен константом, као у следећем изразу, то значи да вредност сваког елемента низа не може бити промењена:

цонст цхар арр [] = 'а', 'б', 'ц', 'д';

Било да је реч о „а“, „б“, „ц“ или „д“, и даље се не може променити у неку другу вредност (знак).

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

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

јавно:
цхар цх0 = 'а';
цхар цх1 = 'б';
цхар цх2 = 'ц';
цхар цх3 = 'д';
;
инт маин ()

цонст Цла обј;
ретурн 0;

Због изјаве „цонст Цла обј;“ са цонст у функцији маин (), ни „а“, ни „б“, ни „ц“ ни „д“ не могу се променити у неку другу вредност.

Спецификације класе складишта:

Спецификатори класе складишта су статични, променљиви, тхреад_лоцал и ектерн.

Тхе статички спецификатор класе складишта

Спецификатор класе статичке меморије омогућава променљивој да живи након проласка опсега, али не може му се приступити директно.

Следећи програм то илуструје рекурзивном функцијом:

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

статички инт стац = 10;
цоут << stac < 50)

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

фунцт ();

инт маин ()

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

Излаз је:

10 20 30 40 50

Ако статичка променљива није иницијализована при својој првој декларацији, она узима подразумевану вредност за свој тип.

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

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

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

јавно:
статички цонст инт нум = 8;
;
инт маин ()

цоут << Cla::num << '\n';
ретурн 0;

Излаз је:

8

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

Следећи програм илуструје употребу „статиц“ за функцију члана:

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

јавно:
метода статичке празнине ()

цоут << "Of static member function!" << '\n';

;
инт маин ()

Цла :: метход ();
ретурн 0;

Излаз је:

Функције статичког члана!

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

Променљиви Спецификатор

Запамтите, одозго, да ако инстанцирани објекат започне са цонст, вредност било ког од његових нормалних чланова података не може се променити. А да би се било који такав члан података променио, мора бити проглашен променљивим.

Следећи програм то илуструје:

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

јавно:
цхар цх0 = 'а';
цхар цх1 = 'б';
променљиви знак цх2 = 'ц';
цхар цх3 = 'д';
;
инт маин ()

цонст Цла обј;
обј.цх2 = 'з';
цоут << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
ретурн 0;

Излаз је:

'а "б" з "д"

Спецификатор тхреад_лоцал

У нормалном покретању програма извршава се један сегмент кода, затим следећи сегмент кода, након чега следи други сегмент кода, и тако даље. То је једна нит; главна нит. Ако се два сегмента кода извршавају истовремено (исто трајање), тада је потребна друга нит. Резултат друге нити може бити спреман и пре главне нити.

Функција маин () је попут главне нити. Програм може имати више од две нити за такво асинхроно понашање.

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

Следећи кратки програм илуструје употребу спецификатора тхреад_лоцал:

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

интер = интер + 1;
цоут << inter << "nd thread\n";

инт маин ()

нит тхр (& тхреад_фунцтион); // тхр почиње да се изводи
цоут << inter << "st or main thread\n";
тхр.придружити(); // главна нит чека нит, тхр да се заврши
ретурн 0;

Излаз је:

1. или главна нит
2. нит

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

За рад нити је потребан посебан објекат. За овај програм библиотека коју укључује „#инцлуде ”Има класу која се назива нит, из које је инстанциран објекат тхр. Конструктор за овај објекат узима референцу на функцију нити као аргумент. Назив функције нити у овом програму је тхреад_фунцтион ().

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

Спољни спецификатор

Једноставно речено, за декларацију се меморија не додељује за променљиву или функцију, док се за дефиницију додељује меморија. Вањска резервирана ријеч омогућава декларирање глобалне варијабле или функције у једној датотеци, али дефинисање у другој. Такве датотеке се називају преводилачке јединице за комплетну Ц ++ апликацију.

Откуцајте следећи програм и сачувајте га са именом датотеке маинФиле:

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

миФн ();
ретурн 0;

Променљива миИнт, константа променљива цх и функција миФн () декларисане су без дефинисања.

Укуцајте следећи програм са дефиницијама и сачувајте га са именом датотеке, отхерФиле, у истом директоријуму:

#инцлуде
коришћење простора имена стд;
инт миИнт = 10;
цонст цхар цх = 'ц';
воид миФн ()

цоут << "myFn() says " << myInt << " and " << ch <<'\n';

Покушајте да компајлирате апликацију на терминалу (ДОС цомманд промпт) помоћу следеће наредбе и приметите да се можда неће компајлирати:

г ++ главна датотека.цпп отхерФиле.цпп -о завршен.еке

Сада, испред три декларације у маинФиле ставите реч „ектерн“, како следи:

ектерн инт миИнт;
ектерн цонст цхар цх;
ектерн воид миФн ();

Поново сачувајте маинФиле. Саставите пријаву са:

г ++ главна датотека.цпп отхерФиле.цпп -о завршен.еке

(Тако се у Ц ++ компајлирају одвојене датотеке за исту апликацију)

И требало би да се компајлира. Сада покрените апликацију, довршите.еке, а излаз би требао бити:

миФн () каже 10 и в

Имајте на уму да се употребом „ектерн“ константна променљива може декларисати у једној датотеци, али дефинисати у другој. Када се ради о декларацији и дефиницији функције у различитим датотекама, употреба ектерна није обавезна.

Када користити екстерн? Користите га када немате датотеке заглавља са глобалним декларацијама.

„Ектерн“ се такође користи са декларацијама шаблона - погледајте касније.

Закључак:

Варијабла којој претходи цонст и / или испарљива је врста квалификована за цв. Променљива којој не претходи ни цонст, ни волатиле ни обоје, је цв-неквалификовани тип.

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

ВинМоусе вам омогућава да прилагодите и побољшате кретање показивача миша на Виндовс рачунару
Ако желите да побољшате подразумеване функције показивача миша, користите бесплатни програм ВинМоусе. Додаје још функција које ће вам помоћи да на нај...
Леви тастер миша не ради у оперативном систему Виндовс 10
Ако уз преносни рачунар или стони рачунар користите наменски миш, али тастер миша не ради у оперативном систему Виндовс 10/8/7 из неких разлога, ево н...
Курсор скаче или се насумично помера док куцате у оперативном систему Виндовс 10
Ако откријете да курсор миша скаче или се сам помера, аутоматски, насумично док куцате на Виндовс преносном рачунару или рачунару, неки од ових предло...