Rozsah v C ++

Scope C



Entita v C ++ má název, který lze deklarovat a/nebo definovat. Deklarace je definice, ale definice nemusí být deklarace. Definice alokuje paměť pro pojmenovanou entitu, ale deklarace může, ale nemusí alokovat paměť pro pojmenovanou entitu. Deklarativní oblast je největší částí programu, ve kterém je platný název entity (proměnné). Tato oblast se nazývá obor nebo potenciální obor. Tento článek vysvětluje rozsah v jazyce C ++. K pochopení tohoto článku jsou navíc zapotřebí základní znalosti v jazyce C ++.

Obsah článku

Deklarativní oblast a rozsah

Deklarativní oblast je největší část textu programu, ve které je platný název entity. Je to oblast, ve které lze nekvalifikovaný název použít (vidět) k označení stejné entity. Zvažte následující krátký program:







#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn()
{
intkde= 3;
-li (1==1)
{
náklady<<kde<<' n';
}
}

inthlavní()
{
fn();
vrátit se 0;
}

Funkce fn () má dva bloky: vnitřní blok pro podmínku if a vnější blok pro tělo funkce. Identifikátor var je zaveden a viděn ve vnějším bloku. Je také vidět ve vnitřním bloku s příkazem cout. Vnější i vnitřní bloky jsou rozsahem názvu, var.



Název var však lze i nadále použít k deklaraci jiné entity, například float ve vnitřním bloku. Následující kód to ilustruje:



#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn()
{
intkde= 3;
-li (1==1)
{
plovákkde= 7.5;
náklady<<kde<<' n';
}
}

inthlavní()
{
fn();
vrátit se 0;
}

Výstup je 7,5. V tomto případě již název var nelze použít ve vnitřním bloku k odkazu na celé číslo hodnoty 3, které bylo zavedeno (deklarováno) ve vnějším bloku. Takové vnitřní bloky se označují jako potenciální rozsah pro entity deklarované ve vnějším bloku.





Poznámka: Entitu stejného typu, jako je vnější blok, lze stále deklarovat ve vnitřním bloku. V tomto případě je však ve vnitřním bloku platné nové prohlášení a jeho význam, zatímco staré prohlášení a jeho význam mimo vnitřní blok zůstávají platné ve vnějším bloku.

Deklarace stejného jména ve vnitřním bloku obvykle přepíše deklaraci stejného jména mimo tento vnitřní blok. Vnitřní bloky mohou vnořovat další vnitřní bloky.



Globální rozsah

Když programátor právě začne psát soubor, je to globální rozsah. Následující krátký program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

plovákkde= 9.4;

inthlavní()
{
náklady <<kde<<' n';
náklady <<::kde<<' n';

vrátit se 0;
}

Výstupem je:
9.4
9.4

V tomto případě deklarativní oblast nebo rozsah pro var začíná od bodu deklarace pro var, pokračuje směrem dolů až do konce souboru (překladová jednotka).

Blok funkce main () má jiný rozsah; je to vnořený rozsah pro globální rozsah. K přístupu k entitě globálního rozsahu z jiného oboru se identifikátor používá přímo nebo předchází operátor rozlišení oboru ::.

Poznámka: Entita, main (), je také deklarována v globálním rozsahu.

Rozsah působnosti

Každý příkaz if, while, do, for, nebo switch může definovat blok. Takové prohlášení je složené prohlášení. Název proměnné deklarované v bloku má rozsah bloku. Jeho rozsah začíná v bodě deklarace a končí na konci bloku. Následující krátký program to ilustruje pro proměnnou ident:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
-li (1==1)
{
/*nějaká prohlášení*/
intident= 5;
náklady<<ident<<' n';
/*nějaká prohlášení*/
}
vrátit se 0;
}

Proměnná, jako je ident, deklarovaná v rozsahu bloku, je místní proměnná.

Proměnnou deklarovanou mimo rozsah bloku a nad ní lze vidět v záhlaví bloku (např. Podmínka pro if-block) a také v rámci bloku. Následující krátký program to ilustruje pro proměnnou identif:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
intidentifikace= 8;

-li (identifikace== 8)
{
náklady<<identifikace<<' n';
}
vrátit se 0;
}

Výstup je 8. Jsou zde dva rozsahy bloků: blok pro funkci main () a vnořený příkaz if-Compound. Vnořený blok je potenciálním rozsahem funkčního bloku main ().

Deklaraci zavedenou v oboru bloku nelze vidět mimo blok. Následující krátký program, který není kompilován, to ilustruje proměnnou variab:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
-li (1 == 1)
{
intvariab= patnáct;
}
náklady<<variab<<' n'; // chyba: přístup mimo její rozsah.

vrátit se 0;
}

Kompilátor vytvoří chybovou zprávu pro proměnnou.

Entitu zavedenou deklarovanou v záhlaví složené funkce nelze vidět mimo (níže) složený příkaz. Následující kód pro smyčku nebude kompilován, což má za následek chybovou zprávu:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
pro (int=0;<4; ++)
{
náklady<<<<'';
}
náklady<<<<'';

vrátit se 0;
}

Proměnná iterace, i, je vidět uvnitř bloku pro smyčku, ale ne mimo blok pro smyčku.

Rozsah funkcí

Ve funkčním bloku je vidět funkční parametr. Entita deklarovaná ve funkčním bloku je viditelná od bodu deklarace do konce funkčního bloku. Následující krátký program to ilustruje:

#zahrnout
#zahrnout
použitím jmenný prostorhodiny;

řetězec fn(řetězec str)
{
charstri[] = 'banány';
/*ostatní prohlášení*/
řetězec totalStr=p+stri;
vrátit setotalStr;
}

inthlavní()
{
řetězec totStr=fn('jíst');
náklady<<totStr<<' n';

vrátit se 0;
}

Výstupem je:
jíst banány

Poznámka: Entitu deklarovanou mimo funkci (nad ní) lze vidět v seznamu parametrů funkce a také ve funkčním bloku.

Označení

Rozsah štítku je funkce, ve které se zobrazuje. Následující kód to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn()
{
jít dolabl;
/*ostatní prohlášení*/
labl: intne= 2;
náklady<<ne<<' n';
}

inthlavní()
{
fn();

vrátit se 0;
}

Výstup je 2.

Rozsah výčtu

Unscoped Enumeration
Zvažte následující if-block:

-li (1==1)
{
enum {a, b, c=b+2};
náklady<<na<<''<<b<<''<<C<<' n';
}

Výstup je 0 1 3.

První řádek v bloku je výčet, a, b, a c jsou jeho výčty. Rozsah výčtu začíná od bodu deklarace do konce uzavírajícího bloku výčtu.

Následující příkaz nebude kompilován, protože bod deklarace c je za bodem a:

enum {na=C+2, před naším letopočtem};

Následující segment kódu nebude kompilován, protože k enumerátorům se přistupuje po uzavíracím bloku výčtu:

-li (1==1)
{
enum {a, b, c=b+2};
}
náklady<<na<<''<<b<<''<<C<<' n'; // chyba: mimo rozsah

Výše uvedený výčet je popsán jako neskenovaný výčet a jeho enumerátory jsou popsány jako neskenované enumerátory. Důvodem je, že začíná pouze vyhrazeným slovem enum. Výčty, které začínají třídou výčtu nebo strukturou výčtu, jsou popsány jako výčty s rozsahem. Jejich sčítači jsou popsáni jako sčítací výčty.

Rozsah výčtu
Následující prohlášení je v pořádku:

enum třídamužský{a, b, c=b+2};

Toto je příklad rozsahu výčtu. Název třídy je nam. Zde rozsah výčtu začíná od bodu deklarace do konce definice výčtu, a nikoli do konce uzavíracího bloku pro výčet. Následující kód nebude kompilován:

-li (1==1)
{
enum třídamužský{a, b, c=b+2};
náklady<<na<<''<<b<<''<<C<<' n'; // chyba: mimo rozsah třídy výčtu nebo struktury výčtu
}

Rozsah třídy

S normálním rozsahem začíná deklarativní oblast od bodu, poté pokračuje a zastaví se v jiném bodě. Rozsah existuje v jedné souvislé oblasti. U třídy může být rozsah entity v různých oblastech, které nejsou spojeny dohromady. Pravidla pro vnořené bloky stále platí. Následující program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

// Základní třída
třídaCla
{
soukromé:
intmemP= 5;
chráněný:
intmemPro= 9;
veřejnost:
prázdnéfn()
{
náklady<<memP<<' n';
}
};

// Odvozená třída
třídaDerCla: veřejnostCla
{
veřejnost:
intderMem=memPro;
};
inthlavní()
{
cla obj;
obj.fn();
DerCla derObj;
náklady<<derObj.derMem<<' n';

vrátit se 0;
}

Výstupem je:
5
9

Ve třídě Cla je proměnná memP vidět v bodě deklarace. Poté se přeskočí krátká část chráněného objektu a pak se znovu zobrazí ve funkčním bloku člena třídy. Odvozená třída se přeskočí a poté se znovu zobrazí v rozsahu funkce (bloku) funkce main ().

Ve třídě Cla je proměnná memPro vidět v bodě deklarace. Část veřejné funkce fn () se přeskočí a pak se zobrazí v bloku popisu odvozené třídy. Je to vidět znovu dole ve funkci main ().

Provozovatel rozlišení rozsahu
Operátor rozlišení oboru v C ++ je ::. Slouží k přístupu ke statickému členu třídy. Následující program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

třídaCla
{
veřejnost:
statický int konstmem= 5;
veřejnost:
statický prázdnéfn()
{
náklady<<mem<<' n';
}
};
inthlavní()
{
náklady<<Cla::mem<<' n';
Cla::fn();

vrátit se 0;
}

Výstupem je:
5
5

Statické členy jsou vidět ve funkčním bloku main (), ke kterému se přistupuje pomocí operátoru rozlišení oboru.

Rozsah parametru šablony

Normální rozsah názvu parametru šablony začíná od bodu deklarace do konce jeho bloku, jako v následujícím kódu:

šablona<typenameT,typenameU> strukturaVěky
{
T Johne= jedenáct;
Ty Petře= 12.3;
T Mary= 13;
U Joy= 14.6;
};

U a T jsou vidět v bloku.

U prototypu funkce šablony začíná rozsah od bodu deklarace do konce seznamu parametrů funkce, jako v následujícím příkazu:

šablona<typenameT,typenameU> prázdnéfunkce(Ty ne, u cha,konst char *p);

Pokud však jde o popis třídy (definice), rozsah může mít také různé části jako v následujícím kódu:

#zahrnout
použitím jmenný prostorhodiny;

šablona<třídaT,třídaU> třídaTheCla
{
veřejnost:
t num;
statickýU ch;

prázdnéfunkce(Otče,konst char *p)
{
náklady << 'Existují ' <<na jednom<< „knihy, které stojí za to“ <<Ne<<p<< ' v obchodě.' << ' n';
}
statický prázdnézábava(U ch)
{
-li (ch== 'na')
náklady << 'Oficiální statická členská funkce' << ' n';
}
};

inthlavní()
{
TheCla<int,char>obj;
obj.na jednom = 12;
obj.funkce('$','500');

vrátit se 0;
}

Jméno se skrývá

Příklad skrytí názvu nastane, když je název stejného typu objektu znovu deklarován ve vnořeném bloku. Následující program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn()
{
intkde= 3;
-li (1==1)
{
intkde= 4;
náklady<<kde<<' n';
}
náklady<<kde<<' n';
}

inthlavní()
{
fn();
vrátit se 0;
}

Výstupem je:
4
3

Je to proto, že var ve vnořeném bloku skrýval var ve vnějším bloku.

Možnost opakování deklarace ve stejném rozsahu

Bod deklarace je tam, kde je název uveden (poprvé) v jeho rozsahu.

Prototyp funkce
Různé entity, dokonce různých typů, nelze normálně deklarovat ve stejném rozsahu. Prototyp funkce však může být deklarován více než jednou ve stejném rozsahu. Následující program se dvěma funkčními prototypy a odpovídající definicí funkce to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn(intna jednom);
prázdnéfn(intna jednom);

prázdnéfn(intna jednom)
{
náklady<<na jednom<<' n';
}

inthlavní()
{
fn(5);

vrátit se 0;
}

Program funguje.

Přetížené funkce
Přetížené funkce jsou funkce se stejným názvem, ale s různými podpisy funkcí. Jako další výjimku lze přetížené funkce se stejným názvem definovat ve stejném rozsahu. Následující program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

prázdnéfn(intna jednom)
{
náklady<<na jednom<<' n';
}

prázdnéfn(plovákNe)
{
náklady<<Ne<<' n';
}

inthlavní()
{
fn(5);
plovákflt= 8.7;
fn(flt);

vrátit se 0;
}

Výstupem je:
5
8.7

Přetížené funkce byly definovány v globálním rozsahu.

Rozsah oboru názvů

Namespace Scope si zaslouží vlastní článek. Uvedený článek byl napsán pro tento web linuxhint.com. Stačí do vyhledávacího pole na tomto webu (stránce) zadat hledaná slova Namespace Scope a kliknout na OK a článek získáte.

Rozsah v různých částech

Třída není jediným schématem, kde může být rozsah v různých částech. Specifikátor přítele, určitá použití specifikátoru typu propracovaného typu a směrnice použití jsou další schémata, kde je rozsah na různých místech-podrobnosti viz později.

Závěr

Rozsah je deklarativní oblast. Deklarativní oblast je největší část textu programu, ve které je platný název entity. Lze jej rozdělit na více než jednu část v souladu s určitými programovacími schématy, například vnořenými bloky. Části, které nemají bod deklarace, tvoří potenciální rozsah. Potenciální rozsah může, ale nemusí mít prohlášení.