Obsah článku
- Deklarativní oblast a rozsah
- Globální rozsah
- Rozsah bloku
- Rozsah funkcí
- Rozsah výčtu
- Rozsah třídy
- Rozsah parametru šablony
- Skrytí jména
- Možnost opakování deklarace ve stejném rozsahu
- Rozsah jmenného prostoru
- 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 použít (vidět) nekvalifikovaný název pro odkaz na stejnou entitu. Zvažte následující krátký program:
#zahrnoutpomocí jmenného prostoru std;
void fn ()
int var = 3;
pokud (1 == 1)
cout<
int main ()
fn ();
návrat 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 to 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 stále použít k deklaraci jiné entity, například float ve vnitřním bloku. Následující kód to ilustruje:
#zahrnoutpomocí jmenného prostoru std;
void fn ()
int var = 3;
pokud (1 == 1)
float var = 7.5;
cout<
int main ()
fn ();
návrat 0;
Výstup je 7.5. V tomto případě název, var, již 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í obor pro entity deklarované ve vnějším bloku.
Poznámka: Ve vnitřním bloku lze stále deklarovat entitu stejného typu, jako je entita vnějšího bloku. V tomto případě však platí ve vnitřním bloku nová deklarace a její význam, zatímco stará deklarace a její význam mimo vnitřní blok zůstávají platné ve vnějším bloku.
Deklarace se stejným názvem ve vnitřním bloku normálně přepíše deklaraci se stejným názvem mimo tento vnitřní blok. Vnitřní bloky mohou vnořit další vnitřní bloky.
Globální rozsah
Když programátor právě začne psát soubor, jedná se o globální obor. Ilustruje to následující krátký program:
#zahrnoutpomocí jmenného prostoru std;
float var = 9.4;
int main ()
cout <cout <<::var<<'\n';
návrat 0;
Výstupem je:
9.4
9.4
V tomto případě začíná deklarativní oblast nebo rozsah pro var od bodu deklarace pro var, pokračuje dolů až do konce souboru (překladová jednotka).
Blok funkce main () má jiný rozsah; jedná se o vnořený obor pro globální obor. Pro přístup k entitě globálního oboru se z jiného oboru použije identifikátor přímo nebo před ním operátor rozlišení oboru, :: .
Poznámka: Entita main () je také deklarována v globálním rozsahu.
Rozsah bloku
Příkaz if, while, do, for, nebo switch může každý 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:
#zahrnoutpomocí jmenného prostoru std;
int main ()
pokud (1 == 1)
/ * některá prohlášení * /
int ident = 5;
cout<
návrat 0;
Proměnná, jako například 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ř.G., podmínka pro if-block) a také v rámci bloku. Následující krátký program to ilustruje pro proměnnou identif:
#zahrnoutpomocí jmenného prostoru std;
int main ()
int identif = 8;
if (identif == 8)
cout<
návrat 0;
Výstup je 8. Zde jsou dva rozsahy bloků: blok pro funkci main () a vnořený příkaz if-compound. Vnořený blok je potenciálním oborem funkčního bloku main ().
Deklaraci zavedenou v rozsahu bloku nelze vidět mimo blok. Následující krátký program, který se nezkompiluje, to ilustruje proměnnou variab:
#zahrnoutpomocí jmenného prostoru std;
int main ()
pokud (1 == 1)
int variab = 15;
cout<
Kompilátor produkuje chybovou zprávu pro proměnnou.
Entitu představenou deklarovanou v záhlaví složené funkce nelze vidět mimo (dole) složený příkaz. Následující kód pro smyčku nebude kompilován, což povede k chybové zprávě:
#zahrnoutpomocí jmenného prostoru std;
int main ()
pro (int i = 0; i<4; ++i)
cout<
cout<návrat 0;
Proměnná iterace, i, je vidět uvnitř bloku pro smyčku, ale ne mimo blok pro smyčku.
Rozsah funkcí
Funkční parametr je vidět ve funkčním bloku. Entita deklarovaná ve funkčním bloku je viděna od bodu deklarace po konec funkčního bloku. Ilustruje to následující krátký program:
#zahrnout#zahrnout
pomocí jmenného prostoru std;
řetězec fn (řetězec str)
char stri [] = "banány";
/ * další prohlášení * /
řetězec totalStr = str + stri;
návrat totalStr;
int main ()
řetězec totStr = fn ("jíst");
cout<
Výstupem je:
jíst banány
Poznámka: Entitu deklarovanou mimo funkci (nad ní) lze vidět v seznamu funkčních parametrů a také ve funkčním bloku.
Označení
Rozsah štítku je funkce, ve které se objeví. Následující kód to ilustruje:
#zahrnoutpomocí jmenného prostoru std;
void fn ()
goto labl;
/ * další prohlášení * /
labl: int inte = 2;
cout<
int main ()
fn ();
návrat 0;
Výstup je 2.
Rozsah výčtu
Uncoped Enumeration
Zvažte následující blok if:
enum a, b, c = b + 2;
cout<
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 až na konec 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 a = c + 2, b, c;Následující segment kódu se nezkompiluje, protože k enumerátorům se přistupuje po uzavírajícím bloku výčtu:
pokud (1 == 1)enum a, b, c = b + 2;
cout<Výše uvedený výčet je popsán jako nezakódovaný výčet a jeho výčty jsou popsány jako nezakódované výčty. Je to proto, že začíná pouze rezervovaný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 výčty jsou popsány jako vyčíslené výčty.
Rozsahovaný výčet
Následující prohlášení je v pořádku:
Toto je příklad stanoveného výčtu. Název třídy je nam. Tady obor výčtu začíná od bodu deklarace až na konec definice výčtu, a ne na konci uzavírajícího bloku výčtu. Následující kód nebude kompilován:
pokud (1 == 1)enum třída nam a, b, c = b + 2;
cout<
Rozsah třídy
Při normálním rozsahu 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 obor entity v různých oblastech, které nejsou spojeny dohromady. Pravidla pro vnořené bloky stále platí. Ilustruje to následující program:
#zahrnoutpomocí jmenného prostoru std;
// Základní třída
třída Cla
soukromé:
int memP = 5;
chráněný:
int memPro = 9;
veřejnost:
void fn ()
cout<
;
// Odvozená třída
třída DerCla: veřejná Cla
veřejnost:
int derMem = memPro;
;
int main ()
Cla obj;
obj.fn ();
DerCla derObj;
cout<
Výstupem je:
5
9
Ve třídě Cla je proměnná memP vidět v místě deklarace. Poté se krátká část „chráněné“ přeskočí a poté se znovu zobrazí ve funkčním bloku člena třídy. Odvozená třída je přeskočena a znovu viděna v rozsahu funkcí main () (bloku).
Ve třídě Cla, proměnná memPro, je vidět v místě deklarace. Část veřejné funkce fn () je přeskočena a poté viděna v bloku popisu odvozené třídy. Je to opět vidět dole ve funkci main ().
Provozovatel řešení rozsahu
Operátor rozlišení oboru v C ++ je :: . Používá se pro přístup ke statickému členu třídy. Ilustruje to následující program:
pomocí jmenného prostoru std;
třída Cla
veřejnost:
static int const mem = 5;
veřejnost:
static void fn ()
cout<
;
int main ()
cout<
návrat 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:
šablonaT John = 11;
U Peter = 12.3;
T Mary = 13;
U Joy = 14.6;
;
U a T jsou vidět v bloku.
U prototypu funkce šablony začíná obor od bodu deklarace na konec seznamu parametrů funkce, jako v následujícím prohlášení:
šablonaPokud však jde o popis (definici) třídy, rozsah může mít také různé části jako v následujícím kódu:
#zahrnoutpomocí jmenného prostoru std;
šablona
veřejnost:
T num;
statický U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
static void fun (U ch)
if (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla
obj.num = 12;
obj.func ('$', "500");
návrat 0;
Skrytí jména
Příklad skrytí názvu nastane, když je ve vnořeném bloku znovu deklarován název stejného typu objektu. Ilustruje to následující program:
#zahrnoutpomocí jmenného prostoru std;
void fn ()
int var = 3;
pokud (1 == 1)
int var = 4;
cout<
cout<
int main ()
fn ();
návrat 0;
Výstupem je:
4
3
Je to proto, že var ve vnořeném bloku skryl var ve vnějším bloku.
Možnost opakování deklarace ve stejném rozsahu
Bodem prohlášení je místo, kde je název (poprvé) zaveden v jeho rozsahu.
Funkční prototyp
Různé entity, dokonce i různých typů, nelze normálně deklarovat ve stejném rozsahu. Prototyp funkce však může být deklarován vícekrát ve stejném rozsahu. Ilustruje to následující program se dvěma prototypy funkcí a odpovídající definicí funkce:
pomocí jmenného prostoru std;
void fn (int num);
void fn (int num);
void fn (int num)
cout<
int main ()
fn (5);
návrat 0;
Program funguje.
Přetížené funkce
Přetížené funkce jsou funkce se stejným názvem, ale odlišnými podpisy funkcí. Jako další výjimku lze přetížené funkce se stejným názvem definovat ve stejném oboru. Ilustruje to následující program:
pomocí jmenného prostoru std;
void fn (int num)
cout<
void fn (float no)
cout<
int main ()
fn (5);
float flt = 8.7;
fn (flt);
návrat 0;
Výstupem je:
5
8.7
Přetížené funkce byly definovány v globálním rozsahu.
Rozsah jmenného prostoru
Obor jmenného prostoru si zaslouží svůj vlastní článek. Uvedený článek byl napsán pro tento web, linuxhint.com. Jednoduše zadejte hledaná slova „Namespace Scope“ do vyhledávacího pole na tomto webu (stránce) a klikněte na OK, čímž získáte článek.
Rozsah v různých částech
Třída není jediným schématem, kde může být obor v různých částech. Specifikátor přítele, určitá použití specifikátoru zpracovaného typu a direktivy using jsou další schémata, kde je rozsah na různých místech - podrobnosti viz dále.
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, jako jsou vnořené bloky. Části, které nemají bod prohlášení, tvoří potenciální rozsah. Potenciální rozsah může, ale nemusí mít prohlášení.