Обхват в C ++

Scope C



Обект в C ++ има име, което може да бъде декларирано и/или дефинирано. Декларацията е определение, но определението не е задължително декларация. Дефиницията разпределя памет за посочения обект, но декларацията може или не може да разпределя памет за посочения обект. Декларативен регион е най -голямата част от програма, в която името на обект (променлива) е валидно. Този регион се нарича обхват или потенциален обхват. Тази статия обяснява обхвата в C ++. Освен това са необходими основни познания по C ++, за да се разбере тази статия.

Съдържание на статията

Декларативен регион и обхват

Декларативен регион е най -голямата част от текста на програмата, в която името на обект е валидно. Това е регионът, в който неквалифицираното име може да бъде използвано (видяно), за да се отнася до един и същ обект. Помислете за следната кратка програма:







#включва
използвайки пространство на именатачаса;

невалиденfn()
{
intкъдето= 3;
ако (1==1)
{
цена<<където<<'н';
}
}

intглавен()
{
fn();
връщане 0;
}

Функцията fn () има два блока: вътрешен блок за условието if и външен блок за тялото на функцията. Идентификаторът, var, се въвежда и вижда във външния блок. Вижда се и във вътрешния блок, с израза cout. Външният и вътрешният блок са обхватът на името, var.



Името var обаче все още може да се използва за деклариране на различен обект, като например поплавък във вътрешния блок. Следният код илюстрира това:



#включва
използвайки пространство на именатачаса;

невалиденfn()
{
intкъдето= 3;
ако (1==1)
{
плувамкъдето= 7.5;
цена<<където<<'н';
}
}

intглавен()
{
fn();
връщане 0;
}

Изходът е 7,5. В този случай името, var, вече не може да се използва във вътрешния блок за препращане към цяло число на стойност 3, което е въведено (декларирано) във външния блок. Такива вътрешни блокове се наричат ​​потенциален обхват за обекти, декларирани във външния блок.





Забележка: Обект от същия тип, като този на външния блок, все още може да бъде деклариран във вътрешния блок. В този случай обаче валидният във вътрешния блок е новата декларация и нейното значение, докато старата декларация и нейното значение извън вътрешния блок остават валидни във външния блок.

Декларация със същото име във вътрешен блок обикновено отменя декларацията със същото име извън този вътрешен блок. Вътрешните блокове могат да гнездят други вътрешни блокове.



Глобален обхват

Когато програмист току -що започне да въвежда файл, това е глобалният обхват. Следващата кратка програма илюстрира това:

#включва
използвайки пространство на именатачаса;

плувамкъдето= 9.4;

intглавен()
{
цена <<където<<'н';
цена <<::където<<'н';

връщане 0;
}

Изходът е:
9.4
9.4

В този случай декларативният регион или обхват за var започва от точката на декларация за var, продължава надолу до края на файла (единица за превод).

Блокът на функцията main () е различен обхват; това е вложен обхват за глобалния обхват. За достъп до обект от глобалния обхват, от различен обхват, идентификаторът се използва директно или предхождан от оператора за разрешаване на обхвата, ::.

Забележка: Обектът main () също е деклариран в глобалния обхват.

Обхват на блока

Операторът if, while, do, for или switch може всеки да дефинира блок. Такова твърдение е сложно твърдение. Името на променлива, декларирано в блок, има обхват на блок. Обхватът му започва в точката на деклариране и завършва в края на блока. Следващата кратка програма илюстрира това за променливата, ident:

#включва
използвайки пространство на именатачаса;

intглавен()
{
ако (1==1)
{
/*някои изявления*/
intидентичен= 5;
цена<<идентичен<<'н';
/*някои изявления*/
}
връщане 0;
}

Променлива, като ident, декларирана в обхвата на блока, е локална променлива.

Променлива, декларирана извън обхвата на блока и над нея, може да се види в заглавката на блока (например условие за if-блок), а също и в рамките на блока. Следващата кратка програма илюстрира това за променливата, identif:

#включва
използвайки пространство на именатачаса;

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

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

Изходът е 8. Тук има два обхвата на блока: блокът за функцията main () и вложеният оператор if-complex. Вложеният блок е потенциалният обхват на функционалния блок main ().

Декларация, въведена в обхват на блок, не може да се види извън блока. Следващата кратка програма, която не се компилира, илюстрира това с променливата variab:

#включва
използвайки пространство на именатачаса;

intглавен()
{
ако (1 == 1)
{
intвариаб= петнадесет;
}
цена<<вариаб<<'н'; // грешка: достъпна извън нейния обхват.

връщане 0;
}

Компилаторът извежда съобщение за грешка за variab.

Въведено образувание, декларирано в заглавката на сложна функция, не може да се види извън (под) съставното изявление. Следният код за цикъл няма да се компилира, което води до съобщение за грешка:

#включва
използвайки пространство на именатачаса;

intглавен()
{
за (inti=0;i<4; ++i)
{
цена<<i<<'';
}
цена<<i<<'';

връщане 0;
}

Итерационната променлива i се вижда вътре в блока for-loop, но не и извън блока for-loop.

Обхват на функцията

Параметърът на функцията се вижда във функционалния блок. Обект, деклариран във функционален блок, се вижда от точката на деклариране до края на функционалния блок. Следващата кратка програма илюстрира това:

#включва
#включва
използвайки пространство на именатачаса;

низ fn(низ str)
{
charстри[] = 'банани';
/*други твърдения*/
низ totalStr=стр+стри;
връщанеобщоStr;
}

intглавен()
{
низ totStr=fn('храня се ');
цена<<totStr<<'н';

връщане 0;
}

Изходът е:
яде банани

Забележка: Обект, деклариран извън функцията (над нея), може да се види в списъка с параметри на функцията, а също и във функционалния блок.

Етикет

Обхватът на етикета е функцията, в която той се появява. Следният код илюстрира това:

#включва
използвайки пространство на именатачаса;

невалиденfn()
{
отидетеlabl;
/*други твърдения*/
labl: intне= 2;
цена<<не<<'н';
}

intглавен()
{
fn();

връщане 0;
}

Изходът е 2.

Обхват на изброяване

Непредвидено изброяване
Помислете за следния if-блок:

ако (1==1)
{
изброяване {а, б, в=б+2};
цена<<да се<<''<<б<<''<<° С<<'н';
}

Изходът е 0 1 3.

Първият ред в блока е изброяване, a, b и c са неговите изброители. Обхватът на изброител започва от точката на деклариране до края на ограждащия блок на изброяването.

Следното изявление няма да се компилира, тъй като точката на декларация на c е след тази на a:

изброяване {да се=° С+2, б, в};

Следният кодов сегмент няма да се компилира, защото до преброителите се осъществява достъп след ограждащия блок на изброяването:

ако (1==1)
{
изброяване {а, б, в=б+2};
}
цена<<да се<<''<<б<<''<<° С<<'н'; // грешка: извън обхвата

Горното изброяване е описано като непредписано изброяване, а неговите изброители са описани като нескопирани изброители. Това е така, защото започва само със запазената дума, enum. Изброяванията, които започват с enum class или enum struct, се описват като изброяване с обхват. Техните изброители са описани като преброители с обхват.

Обхват на изброяване
Следното твърдение е ОК:

изброяване класмъжки{а, б, в=б+2};

Това е пример за изброяване с обхват. Името на класа е nam. Тук обхватът на изброителя започва от точката на деклариране до края на дефиницията на изброяване, а не в края на ограждащия блок за изброяване. Следният код няма да се компилира:

ако (1==1)
{
изброяване класмъжки{а, б, в=б+2};
цена<<да се<<''<<б<<''<<° С<<'н'; // грешка: извън обхвата за enum class или enum struct
}

Обхват на класа

При нормален обхват декларативната област започва от точка, след това продължава и спира в друга точка. Обхватът съществува в един непрекъснат регион. С класа обхватът на обект може да бъде в различни региони, които не са свързани заедно. Правилата за вложени блокове все още важат. Следната програма илюстрира това:

#включва
използвайки пространство на именатачаса;

// Базов клас
класКла
{
частни:
intmemP= 5;
защитени:
intmemPro= 9;
обществен:
невалиденfn()
{
цена<<memP<<'н';
}
};

// Производен клас
класDerCla: общественКла
{
обществен:
intderMem=memPro;
};
intглавен()
{
Cla obj;
obj.fn();
DerCla derObj;
цена<<derObj.derMem<<'н';

връщане 0;
}

Изходът е:
5
9

В класа Cla променливата memP се вижда в точката на деклариране. След това кратката част от защитените се пропуска, след което се вижда отново във функционалния блок на члена на класа. Производният клас се пропуска, след което се вижда отново в обхвата (блок) на функцията main ().

В класа Cla променливата memPro се вижда в точката на деклариране. Частта от публичната функция fn () се пропуска, след което се вижда в описателния блок на производен клас. Той се вижда отново надолу във функцията main ().

Оператор за разрешаване на обхвата
Операторът за разрешаване на обхвата в C ++ е ::. Използва се за достъп до статичен член на класа. Следната програма илюстрира това:

#включва
използвайки пространство на именатачаса;

класКла
{
обществен:
статичен int constмем= 5;
обществен:
статичен невалиденfn()
{
цена<<мем<<'н';
}
};
intглавен()
{
цена<<Кла::мем<<'н';
Кла::fn();

връщане 0;
}

Изходът е:
5
5

Статичните членове се виждат във функционалния блок main (), достъпен с помощта на оператора за разделяне на обхвата.

Обхват на параметрите на шаблона

Нормалният обхват на име на параметър на шаблон започва от точката на деклариране до края на неговия блок, както в следния код:

шаблон<typenameT,typenameU> структураВъзрасти
{
Т Джон= единадесет;
Ти Петър= 12.3;
Т Мери= 13;
U Радост= 14.6;
};

U и T се виждат в блока.

За прототип на шаблонна функция обхватът започва от точката на деклариране до края на списъка с параметри на функцията, както е в следното изявление:

шаблон<typenameT,typenameU> невалиденфункция(Ти не, ча,const char *стр);

Въпреки това, когато става въпрос за описание на класа (дефиниция), обхватът може също да бъде от различни части, както в следния код:

#включва
използвайки пространство на именатачаса;

шаблон<класT,класU> класTheCla
{
обществен:
t num;
статиченU ch;

невалиденфункция(Ти баща,const char *стр)
{
цена << 'Има ' <<никой<< 'книги на стойност' <<не<<стр<< ' в магазина.' << 'н';
}
статичен невалидензабавно(U ch)
{
ако (гл== 'да се')
цена << „Официална статична функция -член“ << 'н';
}
};

intглавен()
{
TheCla<int,char>obj;
obj.никой = 12;
obj.функция('$','500');

връщане 0;
}

Име Скриване

Пример за скриване на имена възниква, когато името на същия тип обект се декларира отново в вложен блок. Следната програма илюстрира това:

#включва
използвайки пространство на именатачаса;

невалиденfn()
{
intкъдето= 3;
ако (1==1)
{
intкъдето= 4;
цена<<където<<'н';
}
цена<<където<<'н';
}

intглавен()
{
fn();
връщане 0;
}

Изходът е:
4
3

Това е така, защото var във вложения блок скрива var във външния блок.

Възможност за повторно деклариране в същия обхват

Точката на декларацията е мястото, където името е въведено (за първи път) в неговия обхват.

Прототип на функцията
Различни обекти, дори от различни типове, обикновено не могат да бъдат декларирани в един и същ обхват. Прототип на функция обаче може да бъде деклариран повече от веднъж в същия обхват. Следващата програма с два функционални прототипа и съответстващо определение на функцията илюстрира това:

#включва
използвайки пространство на именатачаса;

невалиденfn(intникой);
невалиденfn(intникой);

невалиденfn(intникой)
{
цена<<никой<<'н';
}

intглавен()
{
fn(5);

връщане 0;
}

Програмата работи.

Претоварени функции
Претоварените функции са функции със същото име, но различни сигнатури на функции. Като друго изключение, претоварените функции със същото име могат да бъдат дефинирани в същия обхват. Следната програма илюстрира това:

#включва
използвайки пространство на именатачаса;

невалиденfn(intникой)
{
цена<<никой<<'н';
}

невалиденfn(плувамне)
{
цена<<не<<'н';
}

intглавен()
{
fn(5);
плувамflt= 8.7;
fn(flt);

връщане 0;
}

Изходът е:
5
8.7

Претоварените функции са дефинирани в глобалния обхват.

Обхват на пространството на имената

Обхватът на пространството на имената заслужава своя собствена статия. Споменатата статия е написана за този уебсайт, linuxhint.com. Просто въведете думите за търсене Обхват на пространството на имената в полето за търсене на този сайт (страница) и щракнете върху OK и ще получите статията.

Обхват в различни части

Класът не е единствената схема, в която обхватът може да бъде в различни части. Приятелски спецификатор, определени употреби на спецификатора на разработен тип и директиви за използване са други схеми, където обхватът е на различни места-за подробности вижте по-късно.

Заключение

Обхватът е декларативен регион. Декларативен регион е най -голямата част от текста на програмата, в която името на обект е валидно. Тя може да бъде разделена на повече от една част в съответствие с определени програмни схеми, като например вложени блокове. Частите, които нямат точка на декларация, формират потенциалния обхват. Потенциалният обхват може или не може да съдържа декларацията.