Ц ++

Опсег у Ц ++

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

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

Декларативни регион и делокруг

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

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

инт вар = 3;
ако (1 == 1)

цоут<

инт маин ()

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

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

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

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

инт вар = 3;
ако (1 == 1)

флоат вар = 7.5;
цоут<

инт маин ()

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

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

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

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

Глобал Сцопе

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

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

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

Излаз је:
9.4
9.4

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

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

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

Блоцк Сцопе

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

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

ако (1 == 1)

/ * неке изјаве * /
инт идент = 5;
цоут</ * неке изјаве * /

ретурн 0;

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

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

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

инт идентиф = 8;
ако (идентиф == 8)

цоут<
ретурн 0;

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

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

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

ако (1 == 1)

инт варијаб = 15;

цоут<ретурн 0;

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

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

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

за (инт и = 0; и<4; ++i)

цоут<
цоут<ретурн 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

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

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

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

шаблон струцт Агес

Т Јован = 11;
У Петру = 12.3;
Т Марија = 13;
У Радост = 14.6;
;

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

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

шаблон воид фунц (Т не, У цха, цонст цхар * стр);

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

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

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

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

забава у статичкој празнини (У цх)

ако (цх == 'а')
цоут << "Official static member function" << '\n';

;
инт маин ()

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

Наме Хидинг

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

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

инт вар = 3;
ако (1 == 1)

инт вар = 4;
цоут<
цоут<
инт маин ()

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

Излаз је:
4
3

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

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

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

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

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

цоут<
инт маин ()

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

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

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

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

цоут<
воид фн (флоат но)

цоут<
инт маин ()

фн (5);
флоат флт = 8.7;
фн (флт);
ретурн 0;

Излаз је:
5
8.7

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

Простор имена

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

Обим у различитим деловима

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

Закључак

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

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