:: aмали Қайд қилингандан, локал ўзгарувчи эълони худди шу номдаги глобал ўзгарувчини “беркитади” ва бу жойдан глобал ўзгарувчига мурожат қилиш имкони бўлмай қолади. С++ тилида бундай ҳолларда ҳам глобал ўзгарувчига мурожат қилиш имкони мавжуд ва бунинг учун кўриниш соҳасига рухсат бериш амалидан фойдаланиш керак бўлади: ўзгарувчи олдига иккита нуқта (“::”) қўйиш зарур бўлади. Мисол тариқасида қуйидаги програмани келтирамиз:
#inilude //глобал ўзгарувчи эълони
int uzg=5;
int main( )
{
//локал ўзгарувчи эълони
int uzg=70;
//локал ўзгарувчини чоп этиш
cout << uzg << ‘/n’;
//глобал ўзгарувчини чоп этиш
cout << ::uzg << ‘/n’;
return 0;
}
Программа ишлаши натижасида экранга олдин 70 ва куйин 5 сонлари чоп этилади.
Хотира синфлари Ўзгарувчиларнинг кўриниш соҳаси ва амал қилиш вақтини аниқловчи ўзгарувчилар модификатори мавжуд.
Модификатор
Қўлланиши
Амал қилиш соҳаси
Яшаш даври
auto
Глобал
блок
вақтинча
register
Локал
блок
вақтинча
exteru
Глобал
блок
вақтинча
static
Локал
блок
доимий
Глобал
файл
доимий
volatile
Глобал
файл
доимий
Автомат ўзгарувчилар auto модификатори локал ўзгарувчилар эълонида ишлатилади. Одатда локал ўзгарувчилар эълонида бу модификатор келишув бўйича қўлланилади ва шу сабабли амалда уни тушуриб қодирилади:
# include int main( )
{
auto int X= 2; // int X = 2; билан эквивалент
cout <returu 0;
}
auto модификатори блок ичида эълон қилинган локал ўзгарувчиларга қўлланилади. Бу ўзгарувчилар блокдан чиқиши билан автомат равишда йўқ бўлиб кетади.
Регистр ўзгарувчилар register модификатори компиляторга кўрсатилган ўзгарувчини процессор регистрларига жойлаштиришга ҳаракат қилишни тайинлайди. Агар бу ҳаракат натижа бермаса ўзгарувчи auto туридаги локал ўзгарувчи сифатида амал қилади.
Ўзгарувчиларни регистрларда жойлаштириш программа кодини бажариш тезлиги бўйича оптималлаштиради, чунки процессор хотирадаги берилганларга нисбатан регистрдаги қийматлар билан анча тез ишлайди. Лекин регистрлар сони чекланганлиги учун ҳар доим ҳам ўзгарувчиларни регистрларда жойлаштиришнинг иложи бўлмайди.
#include < iostream.h >
int main( )
{
register int Reg;
…
returu 0;
}
register модификатори фақат локал ўзгарувчиларига нисбатан қўлланилади, глобал ўзгарувчиларга қўллаш компиляция хатосига олиб келади.
Ташқи ўзгарувчилар ва функциялар Агар программа бир нечта модулдан иборат бўлса, улар қандайдир ўзгарувчи орқали ўзаро қиймат алмашишлари мумкин (файллар орасида). Бунинг учун ўзгарувчи модулда глобал тарзда эълон қилинади ва бошқа файлда (модулда) у кўриниши учун extern модификатори билан эълон қилинади. Бошқа модификаторларда фарқли равишда extern модификатори ўзгарувчини бошқа файлда эълон қилинганлигини билдирилади. Ташқи ўзгарувчилар ишлатилган ирограммани кўрайлик.
//Sarlavha.h файлида
void Bayroq_Almashsin(void);
// modul_1.cpp файлида
bool Bayroq;
void Bayroq_Almashsin(void);
{Bayroq = !Bayroq; }
// masala.cpp файлида
# include < iostream.h >
# include # include extern bool Bayroq;
int main( )
{
Bayroq_Almashsin( )
if (Bayroq)
cout << “Bayroq TRUE” <else cout << “Bayroq FALSE” <return 0;
}
Олдин sarlavha.h файлида Bayroq_Almashsin( ) функция сарлавҳаси эълон қилинади, кейин modul_1.срр файлида ташқи ўзгарувчи эълон қилинади ва Bayroq_Almashsin( ) функцияси танаси аниқланади. Ва ниҳоят, masala.cpp файлида Bayroq ўзгарувчиси ташқи деб эълон қилинади.