Obsah článku
- Deklarativní oblast a rozsah
- Globální rozsah
- Rozsah působnosti
- Rozsah funkcí
- Rozsah výčtu
- Rozsah třídy
- Rozsah parametru šablony
- Jméno se skrývá
- Možnost opakování deklarace ve stejném rozsahu
- Rozsah oboru názvů
- Rozsah v různých částech
- Závěr
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:
#zahrnoutpouž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:
#zahrnoutpouž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:
#zahrnoutpouž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:
#zahrnoutpouž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:
#zahrnoutpoužitím jmenný prostorhodiny;
inthlavní()
{
pro (intjá=0;já<4; ++já)
{
náklady<<já<<'';
}
náklady<<já<<'';
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:
#zahrnoutpouž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:
{
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:
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:
#zahrnoutpouž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:
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:
#zahrnoutpouž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:
#zahrnoutpouž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:
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:
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í.