C ++

Rozsah v C ++

Rozsah v C ++
Entita v C ++ má název, který lze deklarovat a / nebo definovat. Deklarace je definice, ale definice nemusí být nutně deklarací. Definice přiděluje paměť pojmenované entitě, ale deklarace může a nemusí přidělit paměť pojmenované entitě. Deklarativní oblast je největší část programu, ve které je platný název entity (proměnné). Tomuto regionu se říká obor nebo potenciální obor. Tento článek vysvětluje obor v C++. K pochopení tohoto článku jsou navíc nutné základní znalosti v 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 použít (vidět) nekvalifikovaný název pro odkaz na stejnou entitu. Zvažte následující krátký program:

#zahrnout
pomocí 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:

#zahrnout
pomocí 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:

#zahrnout
pomocí 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:

#zahrnout
pomocí jmenného prostoru std;
int main ()

pokud (1 == 1)

/ * některá prohlášení * /
int ident = 5;
cout</ * některá prohlášení * /

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:

#zahrnout
pomocí 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:

#zahrnout
pomocí jmenného prostoru std;
int main ()

pokud (1 == 1)

int variab = 15;

cout<návrat 0;

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ě:

#zahrnout
pomocí 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<návrat 0;

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:

#zahrnout
pomocí 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:

pokud (1 == 1)

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:

enum třída nam a, b, c = b + 2;

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:

#zahrnout
pomocí 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<návrat 0;

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:

#zahrnout
pomocí jmenného prostoru std;
třída Cla

veřejnost:
static int const mem = 5;
veřejnost:
static void fn ()

cout<
;
int main ()

cout<Cla :: fn ();
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:

šablona strukturní věky

T 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í:

šablona void func (T no, U cha, const char * str);

Pokud 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:

#zahrnout
pomocí jmenného prostoru std;
šablona třída TheCla

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;
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:

#zahrnout
pomocí 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:

#zahrnout
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:

#zahrnout
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í.

Hry Top 10 her k hraní na Ubuntu
Top 10 her k hraní na Ubuntu
Platforma Windows byla jednou z dominujících platforem pro hraní her kvůli velkému procentu her, které se dnes vyvíjejí, aby nativně podporovaly Windo...
Hry 5 nejlepších arkádových her pro Linux
5 nejlepších arkádových her pro Linux
V dnešní době jsou počítače vážné stroje používané k hraní her. Pokud nemůžete získat nové vysoké skóre, budete vědět, co tím myslím. V tomto příspěvk...
Hry Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 vydané minulý měsíc, je šestým vývojovým vydáním v 1.13.série x a přináší řadu vylepšení, zejména do uživatelského rozhraní,...