Rozsah v C ++

Scope C



Entita v C ++ má názov, ktorý je možné deklarovať a/alebo definovať. Deklarácia je definícia, ale definícia nemusí byť nevyhnutne deklaráciou. Definícia alokuje pamäť pre pomenovanú entitu, ale deklarácia môže, ale nemusí alokovať pamäť pre pomenovanú entitu. Deklaratívna oblasť je najväčšia časť programu, v ktorom platí názov entity (premennej). Tento región sa nazýva rozsah alebo potenciálny rozsah. Tento článok vysvetľuje rozsah pôsobnosti v C ++. Okrem toho sú na pochopenie tohto článku potrebné základné znalosti v jazyku C ++.

Obsah článku

Deklaratívna oblasť a rozsah

Deklaratívna oblasť je najväčšia časť textu programu, v ktorom je platný názov entity. Je to oblasť, v ktorej je možné nekvalifikovaný názov použiť (vidieť) na označenie tej istej entity. Zvážte nasledujúci krátky program:







#zahrnúť
použitím priestor mienhodiny;

prázdnyfn()
{
intkde= 3;
keby (1==1)
{
náklady<<kde<<' n';
}
}

intHlavná()
{
fn();
vrátiť sa 0;
}

Funkcia fn () má dva bloky: vnútorný blok pre podmienku if a vonkajší blok pre telo funkcie. Identifikátor var je zavedený a viditeľný vo vonkajšom bloku. Je to tiež vidieť vo vnútornom bloku s príkazom cout. Vonkajší aj vnútorný blok predstavujú rozsah názvu, var.



Názov var sa však dá stále použiť na deklarovanie inej entity, ako je napríklad plavák vo vnútornom bloku. Nasledujúci kód to ilustruje:



#zahrnúť
použitím priestor mienhodiny;

prázdnyfn()
{
intkde= 3;
keby (1==1)
{
plavákkde= 7.5;
náklady<<kde<<' n';
}
}

intHlavná()
{
fn();
vrátiť sa 0;
}

Výstup je 7,5. V tomto prípade už názov var nemôže byť použitý vo vnútornom bloku na odkaz na celé číslo hodnoty 3, ktoré bolo zavedené (deklarované) vo vonkajšom bloku. Také vnútorné bloky sa označujú ako potenciálny rozsah pre entity deklarované vo vonkajšom bloku.





Poznámka: Entitu rovnakého typu, ako je vonkajší blok, je stále možné deklarovať vo vnútornom bloku. Avšak v tomto prípade platí vo vnútornom bloku nová deklarácia a jej význam, zatiaľ čo stará deklarácia a jej význam mimo vnútorného bloku zostávajú platné vo vonkajšom bloku.

Deklarácia rovnakého mena vo vnútornom bloku obvykle prepíše deklaráciu rovnakého mena mimo tohto vnútorného bloku. Vnútorné bloky môžu vnoriť ďalšie vnútorné bloky.



Globálny rozsah

Keď programátor začne písať súbor, ide o globálny rozsah. Nasledujúci krátky program to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

plavákkde= 9.4;

intHlavná()
{
náklady <<kde<<' n';
náklady <<::kde<<' n';

vrátiť sa 0;
}

Výstupom je:
9.4
9.4

V tomto prípade deklaratívna oblasť alebo rozsah pre var začína od bodu deklarácie pre var, pokračuje smerom nadol až do konca súboru (prekladová jednotka).

Blok funkcie main () je iný rozsah; je to vnorený rozsah pre globálny rozsah. Na prístup k entite globálneho rozsahu z iného rozsahu sa identifikátor používa priamo alebo mu predchádza operátor rozlíšenia rozsahu ::.

Poznámka: Entita, main (), je tiež deklarovaná v globálnom rozsahu.

Rozsah pôsobnosti

Každý príkaz if, while, do, for alebo switch môže definovať blok. Takéto tvrdenie je zložené tvrdenie. Názov premennej deklarovanej v bloku má rozsah bloku. Jeho rozsah začína v bode vyhlásenia a končí na konci svojho bloku. Nasledujúci krátky program to ilustruje na premennej ident:

#zahrnúť
použitím priestor mienhodiny;

intHlavná()
{
keby (1==1)
{
/*niekoľko vyhlásení*/
intident= 5;
náklady<<ident<<' n';
/*niekoľko vyhlásení*/
}
vrátiť sa 0;
}

Premenná, ako napríklad ident, deklarovaná v rozsahu bloku, je lokálna premenná.

Premennú deklarovanú mimo rozsah bloku a nad ním je možné vidieť v hlavičke bloku (napr. Podmienka pre if-block) a tiež v rámci bloku. Nasledujúci krátky program to ilustruje pre premennú identif:

#zahrnúť
použitím priestor mienhodiny;

intHlavná()
{
intidentifikácia= 8;

keby (identifikácia== 8)
{
náklady<<identifikácia<<' n';
}
vrátiť sa 0;
}

Výstup je 8. Existujú tu dva rozsahy blokov: blok pre funkciu main () a vnorený príkaz if-Compound. Vnorený blok je potenciálnym rozsahom funkčného bloku main ().

Deklaráciu zavedenú v rozsahu bloku nemožno vidieť mimo bloku. Nasledujúci krátky program, ktorý nekompiluje, to ilustruje pomocou premennej variab:

#zahrnúť
použitím priestor mienhodiny;

intHlavná()
{
keby (1 == 1)
{
intvariab= pätnásť;
}
náklady<<variab<<' n'; // chyba: prístup mimo jej rozsah.

vrátiť sa 0;
}

Kompilátor produkuje chybové hlásenie pre premennú.

Entitu zavedenú deklarovanú v hlavičke zloženej funkcie nemožno vidieť mimo (nižšie) zloženého príkazu. Nasledujúci kód for-loop sa neskompiluje, čo spôsobí chybové hlásenie:

#zahrnúť
použitím priestor mienhodiny;

intHlavná()
{
pre (inti=0;i<4; ++i)
{
náklady<<i<<'';
}
náklady<<i<<'';

vrátiť sa 0;
}

Iteračná premenná i je viditeľná vo vnútri bloku for-loop, ale nie mimo bloku for-loop.

Rozsah funkcií

Vo funkčnom bloku je zobrazený funkčný parameter. Entita deklarovaná vo funkčnom bloku je videná od bodu deklarácie do konca funkčného bloku. Nasledujúci krátky program to ilustruje:

#zahrnúť
#zahrnúť
použitím priestor mienhodiny;

reťazec fn(struna str)
{
charstri[] = „banány“;
/*ostatné vyhlásenia*/
reťazec totalStr=p+stri;
vrátiť satotalStr;
}

intHlavná()
{
reťazec totStr=fn('jesť');
náklady<<totStr<<' n';

vrátiť sa 0;
}

Výstupom je:
jesť banány

Poznámka: Entitu deklarovanú mimo funkcie (nad ňou) je možné vidieť v zozname parametrov funkcie a tiež vo funkčnom bloku.

Štítok

Rozsah štítku je funkcia, v ktorej sa nachádza. Nasledujúci kód to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

prázdnyfn()
{
ísť dolabl;
/*ostatné vyhlásenia*/
labl: intnie= 2;
náklady<<nie<<' n';
}

intHlavná()
{
fn();

vrátiť sa 0;
}

Výstup je 2.

Rozsah výčtu

Neuvedený výpočet
Zvážte nasledujúci if-block:

keby (1==1)
{
enum {a, b, c=b+2};
náklady<<do<<''<<b<<''<<c<<' n';
}

Výstup je 0 1 3.

Prvý riadok v bloku je enumerácia, a, b, c sú jeho enumerátory. Rozsah enumerátora začína od bodu deklarácie do konca hranatého bloku enumerácie.

Nasledujúci príkaz nebude zostavený, pretože bod vyhlásenia c je za bodom a:

enum {do=c+2, b, c};

Nasledujúci segment kódu sa nebude kompilovať, pretože k enumerátorom sa pristupuje po uzavierajúcom bloku enumerácie:

keby (1==1)
{
enum {a, b, c=b+2};
}
náklady<<do<<''<<b<<''<<c<<' n'; // chyba: mimo rozsahu

Vyššie uvedený enumerácia je opísaná ako nekomprimovaný enumerácia a jeho enumerátory sú popísané ako nekomprimovaný enumerátor. Dôvodom je, že začína iba vyhradeným slovom, enum. Výpočty, ktoré začínajú triedou enum alebo štruktúrou enum, sú popísané ako rozsahové enumerácie. Ich sčítači sú opísaní ako vymedzené sčítačky.

Rozsah výčtu
Nasledujúce tvrdenie je v poriadku:

enum triedaMuž{a, b, c=b+2};

Toto je príklad rozsahu výčtu. Názov triedy je nam. Tu rozsah enumerátora začína od bodu deklarácie do konca definície enumerácie, a nie do konca uzatváracieho bloku pre enumeráciu. Nasledujúci kód sa neskompiluje:

keby (1==1)
{
enum triedaMuž{a, b, c=b+2};
náklady<<do<<''<<b<<''<<c<<' n'; // chyba: mimo rozsahu triedy enum alebo štruktúry enum
}

Rozsah triedy

Pri normálnom určovaní rozsahu začína deklaratívna oblasť od bodu, potom pokračuje a zastaví sa v inom bode. Rozsah existuje v jednej súvislej oblasti. V prípade tejto triedy môže byť rozsah entity v rôznych oblastiach, ktoré nie sú navzájom spojené. Pravidlá pre vnorené bloky stále platia. Nasledujúci program to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

// Základná trieda
triedaCla
{
súkromné:
intmemP= 5;
chránené:
intmemPro= 9;
verejná:
prázdnyfn()
{
náklady<<memP<<' n';
}
};

// Odvodená trieda
triedaDerCla: verejnáCla
{
verejná:
intderMem=memPro;
};
intHlavná()
{
Cla obj;
obj.fn();
DerCla derObj;
náklady<<derObj.derMem<<' n';

vrátiť sa 0;
}

Výstupom je:
5
9

V triede Cla je premenná memP v bode deklarácie. Potom sa preskočí krátka časť chráneného a potom sa znova zobrazí vo funkčnom bloku člena triedy. Odvodená trieda sa preskočí a potom sa znova zobrazí v rozsahu funkcie (blok) funkcie main ().

V triede Cla je premenná memPro viditeľná v mieste deklarácie. Časť verejnej funkcie fn () sa preskočí, potom sa zobrazí v bloku popisu odvodenej triedy. Je to opäť vidieť dole v hlavnej funkcii ().

Operátor rozlíšenia rozsahu
Operátor rozlíšenia rozsahu v C ++ je ::. Slúži na prístup k statickému členovi triedy. Nasledujúci program to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

triedaCla
{
verejná:
statický int konštmeme= 5;
verejná:
statický prázdnyfn()
{
náklady<<meme<<' n';
}
};
intHlavná()
{
náklady<<Cla::meme<<' n';
Cla::fn();

vrátiť sa 0;
}

Výstupom je:
5
5

Statické členy sú zobrazené vo funkčnom bloku main (), ku ktorému sa pristupuje pomocou operátora rozlíšenia rozsahu.

Rozsah parametrov šablóny

Bežný rozsah názvu parametra šablóny začína od bodu deklarácie do konca jeho bloku, ako v nasledujúcom kóde:

predloha<typové menoT,typové menoU> StructVeky
{
T John= jedenásť;
Ty Peter= 12.3;
T Mary= 13;
U Radosť= 14.6;
};

U a T sú vidieť v bloku.

V prípade prototypu funkcie šablóny rozsah začína od bodu deklarácie do konca zoznamu parametrov funkcie, ako je to v nasledujúcom vyhlásení:

predloha<typové menoT,typové menoU> prázdnyfunkciu(Ty nie, u cha,konšt char *p);

Pokiaľ však ide o popis (definíciu) triedy, rozsah môže mať aj rôzne časti, ako je uvedené v nasledujúcom kóde:

#zahrnúť
použitím priestor mienhodiny;

predloha<triedaT,triedaU> triedaTheCla
{
verejná:
t num;
statickýU ch;

prázdnyfunkciu(Oteckonšt char *p)
{
náklady << 'Existujú ' <<na jeden<< „knihy, ktoré stoja za to“ <<č<<p<< ' v obchode.' << ' n';
}
statický prázdnyzábava(U ch)
{
keby (ch== „do“)
náklady << „Oficiálna statická členská funkcia“ << ' n';
}
};

intHlavná()
{
TheCla<int,char>obj;
obj.na jeden = 12;
obj.funkciu('$','500');

vrátiť sa 0;
}

Meno sa skrýva

Príklad skrytia mena nastane, keď je názov rovnakého typu objektu znova deklarovaný vo vnorenom bloku. Nasledujúci program to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

prázdnyfn()
{
intkde= 3;
keby (1==1)
{
intkde= 4;
náklady<<kde<<' n';
}
náklady<<kde<<' n';
}

intHlavná()
{
fn();
vrátiť sa 0;
}

Výstupom je:
4
3

Je to preto, že var vo vnorenom bloku skrýval var vo vonkajšom bloku.

Možnosť opakovaného vyhlásenia v rovnakom rozsahu

Ide o to, kde je názov uvedený (po prvýkrát) v jeho rozsahu.

Prototyp funkcie
Rôzne entity, dokonca rôznych typov, nemožno bežne deklarovať v rovnakom rozsahu. Prototyp funkcie však môže byť deklarovaný viac ako raz v rovnakom rozsahu. Nasledujúci program s dvoma prototypmi funkcií a zodpovedajúcou definíciou funkcie to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

prázdnyfn(intna jeden);
prázdnyfn(intna jeden);

prázdnyfn(intna jeden)
{
náklady<<na jeden<<' n';
}

intHlavná()
{
fn(5);

vrátiť sa 0;
}

Program funguje.

Preťažené funkcie
Preťažené funkcie sú funkcie s rovnakým názvom, ale rôznymi podpismi funkcií. Ako ďalšiu výnimku je možné preťažené funkcie s rovnakým názvom definovať v rovnakom rozsahu. Nasledujúci program to ilustruje:

#zahrnúť
použitím priestor mienhodiny;

prázdnyfn(intna jeden)
{
náklady<<na jeden<<' n';
}

prázdnyfn(plavákč)
{
náklady<<č<<' n';
}

intHlavná()
{
fn(5);
plavákflt= 8.7;
fn(flt);

vrátiť sa 0;
}

Výstupom je:
5
8.7

Preťažené funkcie boli definované v globálnom rozsahu.

Rozsah názvov

Namespace Scope si zaslúži vlastný článok. Uvedený článok bol napísaný pre tento web linuxhint.com. Stačí zadať hľadané slová Rozsah názvov do vyhľadávacieho poľa tejto stránky (stránky) a kliknúť na tlačidlo OK, článok sa zobrazí.

Rozsah v rôznych častiach

Trieda nie je jedinou schémou, kde rozsah môže byť v rôznych častiach. Špecifikátor priateľa, určité použitia špecifikátora prepracovaného typu a direktívy o použití sú ďalšie schémy, kde je rozsah pôsobnosti na rôznych miestach-podrobnosti nájdete neskôr.

Záver

Rozsah je deklaratívny región. Deklaratívna oblasť je najväčšia časť textu programu, v ktorom je platný názov entity. Môže byť rozdelený do viac ako jednej časti v súlade s určitými programovacími schémami, ako sú vnorené bloky. Časti, ktoré nemajú bod deklarácie, predstavujú potenciálny rozsah. Potenciálny rozsah pôsobnosti môže, ale nemusí mať vyhlásenie.