Опсег у Ц ++

Scope C



Ентитет у Ц ++ има име које се може декларисати и/или дефинисати. Декларација је дефиниција, али дефиниција није нужно декларација. Дефиниција додјељује меморију именованом ентитету, али декларација може, али и не мора додијелити меморију именованом ентитету. Декларативна регија је највећи део програма у коме је назив ентитета (променљива) важећи. Тај регион се назива опсег или потенцијални опсег. Овај чланак објашњава опсег у Ц ++. Штавише, за разумевање овог чланка потребно је основно знање језика Ц ++.

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

Декларативна регија и опсег

Декларативна регија највећи је део програмског текста у коме је назив ентитета важећи. То је регион у којем се неквалификовани назив може користити (видети) за упућивање на исти ентитет. Размотрите следећи кратки програм:







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

празнинафн()
{
интгде= 3;
ако (1==1)
{
цена<<где<<' н';
}
}

интглавни()
{
фн();
повратак 0;
}

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



Међутим, име вар се и даље може користити за декларисање другачијег ентитета, као што је флоат у унутрашњем блоку. Следећи код то илуструје:



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

празнинафн()
{
интгде= 3;
ако (1==1)
{
пловакгде= 7.5;
цена<<где<<' н';
}
}

интглавни()
{
фн();
повратак 0;
}

Излаз је 7,5. У овом случају, име, вар, се више не може користити у унутрашњем блоку за упућивање на цео број вредности 3, који је уведен (декларисан) у спољном блоку. Такви унутрашњи блокови се називају потенцијалним опсегом за ентитете декларисане у спољном блоку.





Напомена: Ентитет истог типа, попут ентитета спољног блока, и даље се може декларисати у унутрашњем блоку. Међутим, у овом случају оно што важи у унутрашњем блоку је нова декларација и њено значење, док стара декларација и њено значење изван унутрашњег блока остају важећи у спољном блоку.

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



Глобални опсег

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

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

пловакгде= 9.4;

интглавни()
{
цена <<где<<' н';
цена <<::где<<' н';

повратак 0;
}

Излаз је:
9.4
9.4

У овом случају, декларативни регион или опсег за вар почиње од тачке декларације за вар, наставља се надоле до краја датотеке (јединица превођења).

Блок функције маин () је различитог опсега; то је угнежђени опсег за глобални опсег. За приступ ентитету глобалног опсега, из другог опсега, идентификатор се користи директно или му претходи оператор разрешења опсега, ::.

Напомена: Ентитет, маин (), такође је декларисан у глобалном опсегу.

Блоцк Сцопе

Наредба иф, вхиле, до, фор или свитцх може сваки дефинирати блок. Таква изјава је сложена изјава. Назив променљиве која је декларисана у блоку има опсег блока. Његов опсег почиње од тачке декларације и завршава на крају блока. Следећи кратки програм то илуструје за променљиву идент:

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

интглавни()
{
ако (1==1)
{
/*неке изјаве*/
интидент= 5;
цена<<идент<<' н';
/*неке изјаве*/
}
повратак 0;
}

Променљива, као што је идент, декларисана у опсегу блока је локална променљива.

Променљива која је декларисана изван опсега блока и изнад ње може се видети у заглављу блока (нпр. Услов за иф-блок), а такође и унутар блока. Следећи кратки програм то илуструје за променљиву, идентиф:

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

интглавни()
{
интидентиф= 8;

ако (идентиф== 8)
{
цена<<идентиф<<' н';
}
повратак 0;
}

Излаз је 8. Овдје постоје два опсега блокова: блок за функцију маин () и угнијежђени иф-сложени израз. Уметнути блок је потенцијални опсег главног () функционалног блока.

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

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

интглавни()
{
ако (1 == 1)
{
интвариаб= петнаест;
}
цена<<вариаб<<' н'; // грешка: приступа се ван њеног опсега.

повратак 0;
}

Компајлер производи поруку о грешци за вариаб.

Ентитет који је уведен, декларисан у заглављу сложене функције, не може се видети изван (испод) сложеног израза. Следећи код фор-лооп неће се компајлирати, што ће довести до поруке о грешци:

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

интглавни()
{
за (инти=0;и<4; ++и)
{
цена<<и<<'';
}
цена<<и<<'';

повратак 0;
}

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

Опсег функције

Параметар функције се види у функционалном блоку. Ентитет декларисан у функционалном блоку виђен је од тачке декларације до краја функционалног блока. Следећи кратки програм то илуструје:

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

стринг фн(стринг стр)
{
цхарстри[] = 'банане';
/*остале изјаве*/
стринг тоталСтр=п+стри;
повратактоталСтр;
}

интглавни()
{
стринг тотСтр=фн('јести');
цена<<тотСтр<<' н';

повратак 0;
}

Излаз је:
једу банане

Напомена: Ентитет декларисан изван функције (изнад ње) може се видети у листи параметара функција, а такође иу функционалном блоку.

Етикета

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

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

празнинафн()
{
Иди налабл;
/*остале изјаве*/
лабл: интне= 2;
цена<<не<<' н';
}

интглавни()
{
фн();

повратак 0;
}

Излаз је 2.

Опсег набрајања

Непрегледано набрајање
Узмите у обзир следеће иф-блок:

ако (1==1)
{
енум {а, б, ц=б+2};
цена<<до<<''<<б<<''<<ц<<' н';
}

Излаз је 0 1 3.

Први ред у блоку је набрајање, а, б и ц су његови пописивачи. Опсег пописивача почиње од тачке декларације до краја оградног блока пописивања.

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

енум {до=ц+2, пре нове ере};

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

ако (1==1)
{
енум {а, б, ц=б+2};
}
цена<<до<<''<<б<<''<<ц<<' н'; // грешка: ван опсега

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

Набрајање опсега
Следећа изјава је у реду:

енум класаМушки{а, б, ц=б+2};

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

ако (1==1)
{
енум класаМушки{а, б, ц=б+2};
цена<<до<<''<<б<<''<<ц<<' н'; // грешка: ван опсега за енум класу или енум структуру
}

Цласс Сцопе

Са нормалним опсегом, декларативна регија почиње од тачке, затим се наставља и зауставља на другој тачки. Опсег постоји у једном континуираном региону. С класом, опсег ентитета може бити у различитим регијама које нису спојене заједно. Правила за угнежђене блокове и даље важе. Следећи програм то илуструје:

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

// Основна класа
класаЦла
{
приватно:
интмемП= 5;
заштићен:
интмемПро= 9;
јавности:
празнинафн()
{
цена<<мемП<<' н';
}
};

// Изведена класа
класаДерЦла: јавностиЦла
{
јавности:
интдерМем=мемПро;
};
интглавни()
{
Цла обј;
обј.фн();
ДерЦла дерОбј;
цена<<дерОбј.дерМем<<' н';

повратак 0;
}

Излаз је:
5
9

У класи Цла, променљива мемП се види на месту декларисања. Након тога, кратки део заштићеног се прескаче, а затим поново види у функционалном блоку члана класе. Изведена класа се прескаче, а затим поново види у опсегу (блоку) функције маин ().

У класи Цла, променљива мемПро се види на месту декларисања. Део јавне функције фн () се прескаче, а затим види у изведеном блоку описа класе. Поново се види доле у ​​функцији маин ().

Оператор резолуције опсега
Оператор резолуције опсега у Ц ++ је ::. Користи се за приступ статичком члану класе. Следећи програм то илуструје:

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

класаЦла
{
јавности:
статичан инт цонстМима= 5;
јавности:
статичан празнинафн()
{
цена<<Мима<<' н';
}
};
интглавни()
{
цена<<Цла::Мима<<' н';
Цла::фн();

повратак 0;
}

Излаз је:
5
5

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

Опсег параметара предлошка

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

шаблон<типенамеТ,типенамеУ> струцтАгес
{
Т Јохн= Једанаест;
Ти Петер= 12.3;
Т Мари= 13;
У Јои= 14.6;
};

У и Т се виде унутар блока.

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

шаблон<типенамеТ,типенамеУ> празнинафункција(Ти не, ча,цонст цхар *п);

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

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

шаблон<класаТ,класаУ> класаТхеЦла
{
јавности:
т нум;
статичанУ цх;

празнинафункција(Ти оче,цонст цхар *п)
{
цена << 'Постоје ' <<на једном<< 'књиге вредне' <<не<<п<< ' у продавници.' << ' н';
}
статичан празниназабавно(У цх)
{
ако (цх== 'до')
цена << „Званична статичка функција члана“ << ' н';
}
};

интглавни()
{
ТхеЦла<инт,цхар>обј;
обј.на једном = 12;
обј.функција('$','500');

повратак 0;
}

Наме Хидинг

Пример скривања имена јавља се када се име истог типа објекта поново декларише у угнежђеном блоку. Следећи програм то илуструје:

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

празнинафн()
{
интгде= 3;
ако (1==1)
{
интгде= 4;
цена<<где<<' н';
}
цена<<где<<' н';
}

интглавни()
{
фн();
повратак 0;
}

Излаз је:
4
3

То је зато што је вар у угнежђеном блоку сакрио вар у спољном блоку.

Могућност понављања декларације у истом обиму

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

Прототип функције
Различити ентитети, чак и различитих типова, нормално се не могу декларисати у истом опсегу. Међутим, прототип функције може бити декларисан више пута у истом опсегу. Следећи програм са два прототипа функција и одговарајућом дефиницијом функције то илуструје:

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

празнинафн(интна једном);
празнинафн(интна једном);

празнинафн(интна једном)
{
цена<<на једном<<' н';
}

интглавни()
{
фн(5);

повратак 0;
}

Програм ради.

Преоптерећене функције
Преоптерећене функције су функције са истим именом, али различитим потписима функција. Као још један изузетак, преоптерећене функције са истим именом могу се дефинисати у истом опсегу. Следећи програм то илуструје:

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

празнинафн(интна једном)
{
цена<<на једном<<' н';
}

празнинафн(пловакне)
{
цена<<не<<' н';
}

интглавни()
{
фн(5);
пловакфлт= 8.7;
фн(флт);

повратак 0;
}

Излаз је:
5
8.7

Преоптерећене функције су дефинисане у глобалном опсегу.

Намеспаце Сцопе

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

Опсег у различитим деловима

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

Закључак

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