C ++

Rozsah v C ++

Rozsah v C ++
Entita v C ++ má názov, ktorý je možné deklarovať a / alebo definovať. Deklarácia je definícia, ale definícia nie je nevyhnutne deklarácia. Definícia vyhradzuje pamäť pre pomenovanú entitu, ale deklarácia môže a nemusí vyhradiť pamäť pre pomenovanú entitu. Deklaratívna oblasť je najväčšia časť programu, v ktorej je platný názov entity (premennej). Tento región sa nazýva rozsah alebo potenciálny rozsah. Tento článok vysvetľuje rozsah v C++. Na pochopenie tohto článku sú navyše potrebné základné znalosti v jazyku C ++.

Obsah článku

Deklaratívny región a rozsah

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

#include
pomocou namespace std;
void fn ()

int var = 3;
ak (1 == 1)

cout<

int main ()

fn ();
návrat 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 vidieť aj vo vnútornom bloku s vyhlásením cout. Vonkajší a vnútorný blok sú rozsahom názvu, var.

Názov var však možno stále použiť na deklaráciu inej entity, napríklad float vo vnútornom bloku. Ilustruje to nasledujúci kód:

#include
pomocou namespace std;
void fn ()

int var = 3;
ak (1 == 1)

float var = 7.5;
cout<

int main ()

fn ();
návrat 0;

Výstup je 7.5. V takom prípade sa meno var už nemôže vo vnútornom bloku použiť na označenie celého čísla hodnoty 3, ktoré bolo zavedené (deklarované) vo vonkajšom bloku. Takéto 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 entita vonkajšieho bloku, možno stále deklarovať vo vnútornom bloku. V tomto prípade však 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ú v platnosti vo vonkajšom bloku.

Rovnomenná deklarácia vo vnútornom bloku zvyčajne prepíše deklaráciu rovnakého mena mimo tohto vnútorného bloku. Vnútorné bloky môžu vkladať ďalšie vnútorné bloky.

Globálny rozsah

Keď programátor iba začne písať súbor, jedná sa o globálny rozsah. Ilustruje to nasledujúci krátky program:

#include
pomocou namespace std;
float var = 9.4;
int main ()

cout <cout <<::var<<'\n';
návrat 0;

Výstup je:
9.4
9.4

V takom 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 (prekladovej jednotky).

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

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

Rozsah pôsobnosti

Príkaz if, while, do, for, alebo switch môže každý definovať blok. Takéto vyhlásenie je zložené. Názov premennej deklarovanej v bloku má rozsah bloku. Rozsah jeho pôsobnosti sa začína v bode vyhlásenia a končí sa na konci bloku. Nasledujúci krátky program to ilustruje pre premennú ident:

#include
pomocou namespace std;
int main ()

ak (1 == 1)

/ * niektoré vyjadrenia * /
int ident = 5;
cout</ * niektoré vyjadrenia * /

návrat 0;

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

Premennú deklarovanú mimo rozsah bloku a nad ním vidno v hlavičke bloku (napr.g., podmienka pre if-block) a tiež v rámci bloku. Nasledujúci krátky program to ilustruje pre premennú identif:

#include
pomocou namespace std;
int main ()

int identif = 8;
if (identif == 8)

cout<
návrat 0;

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

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

#include
pomocou namespace std;
int main ()

ak (1 == 1)

int premenná = 15;

cout<návrat 0;

Kompilátor vytvorí chybové hlásenie pre premennú.

Entitu zavedenú deklarovanú v hlavičke zloženej funkcie nemožno vidieť mimo (pod) zloženým príkazom. Nasledujúci kód for-loop sa nebude kompilovať, výsledkom bude chybové hlásenie:

#include
pomocou namespace std;
int main ()

pre (int i = 0; i<4; ++i)

cout<
cout<návrat 0;

Premenná iterácie, i, je videná vo vnútri bloku for-loop, ale nie mimo bloku for-loop.

Rozsah funkcií

Funkčný parameter je viditeľný vo funkčnom bloku. Entita deklarovaná vo funkčnom bloku je videná od bodu deklarácie po koniec funkčného bloku. Ilustruje to nasledujúci krátky program:

#include
#include
pomocou namespace std;
string fn (string str)

char stri [] = "banány";
/ * ďalšie vyjadrenia * /
string totalStr = str + stri;
návrat totalStr;

int main ()

string totStr = fn ("jesť");
cout<návrat 0;

Výstup je:
jesť banány

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

Štítok

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

#include
pomocou namespace std;
void fn ()

choď labl;
/ * ďalšie vyjadrenia * /
labl: int inte = 2;
cout<
int main ()

fn ();
návrat 0;

Výstup je 2.

Rozsah výpočtu

Nezakódovaný výpočet
Zvážte nasledujúci blok if:

ak (1 == 1)

enum a, b, c = b + 2;
cout<

Výstup je 0 1 3.

Prvý riadok v bloku je enumerácia, a, b a c sú jeho enumerátory. Rozsah enumerátora začína od deklaračného bodu po koniec priloženého bloku enumerácie.

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

enum a = c + 2, b, c;

Nasledujúci segment kódu sa nebude kompilovať, pretože k enumerátorom sa pristupuje po priloženom bloku výčtu:

ak (1 == 1)

enum a, b, c = b + 2;

cout<Vyššie uvedený výčet je opísaný ako neskódovaný výčet a jeho enumerátory sú opísané ako neskódovaný enumerátor. Je to tak preto, lebo sa to začína iba rezervovaným slovom, enum. Výčty, ktoré začínajú triedou enum alebo štruktúrou enum, sú opísané ako vymenované výčty. Ich enumerátory sa popisujú ako enumerátory s obmedzeným rozsahom.

Rozsahovaný výčet
Nasledujúce tvrdenie je v poriadku:

enum trieda nam a, b, c = b + 2;

Toto je príklad obmedzeného výčtu. Názov triedy je nam. Rozsah enumerátora tu začína od deklaračného bodu po koniec definície enumerácie, nie od konca priloženého bloku pre enumeráciu. Nasledujúci kód sa nebude kompilovať:

ak (1 == 1)

enum trieda nam a, b, c = b + 2;
cout<

Rozsah triedy

Pri normálnom stanovení rozsahu začína deklaratívna oblasť od bodu, potom pokračuje a zastaví sa v inom bode. Rozsah pôsobnosti existuje v jednom súvislom regióne. V rámci tejto triedy môže byť pôsobnosť entity v rôznych regiónoch, ktoré nie sú spojené. Pravidlá pre vnorené bloky stále platia. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
// Základná trieda
trieda Cla

súkromné:
int memP = 5;
chránené:
int memPro = 9;
verejné:
void fn ()

cout<
;
// Odvodená trieda
trieda DerCla: verejná Cla

verejné:
int derMem = memPro;
;
int main ()

Cla obj;
obj.fn ();
DerCla derObj;
cout<návrat 0;

Výstup je:
5
9

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

V triede Cla je premenná memPro videná v bode deklarácie. Časť verejnej funkcie fn () je preskočená a potom viditeľná v bloku popisu odvodenej triedy. Je to opäť vidieť dole vo funkcii main ().

Prevádzkovateľ riešenia rozsahu
Operátor rozlíšenia rozsahu v C ++ je :: . Používa sa na prístup k statickému členovi triedy. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
trieda Cla

verejné:
static int const mem = 5;
verejné:
static void fn ()

cout<
;
int main ()

cout<Cla :: fn ();
návrat 0;

Výstup je:
5
5

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

Rozsah parametra šablóny

Normálny rozsah názvu parametra šablóny sa začína od bodu vyhlásenia do konca jeho bloku, ako v nasledujúcom kóde:

šablóna štruktúrne vekové skupiny

T John = 11;
U Peter = 12.3;
T Mary = 13;
U Joy = 14.6;
;

U a T sú vidieť v bloku.

Pre prototyp funkcie šablóny rozsah začína od bodu deklarácie po koniec zoznamu parametrov funkcie, ako v nasledujúcom vyhlásení:

šablóna void func (T no, U cha, const char * str);

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

#include
pomocou namespace std;
šablóna trieda TheCla

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

Skrývanie mien

Príklad skrytia názvu nastáva, keď sa vo vnorenom bloku znova deklaruje názov rovnakého typu objektu. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
void fn ()

int var = 3;
ak (1 == 1)

int var = 4;
cout<
cout<
int main ()

fn ();
návrat 0;

Výstup je:
4
3

Je to preto, že var vo vnorenom bloku skryl var vo vonkajšom bloku.

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

Pointou vyhlásenia je miesto, kde je názov uvedený (po prvýkrát) v jeho rozsahu pôsobnosti.

Funkčný prototyp
Rôzne entity, dokonca aj rôznych typov, nemožno bežne deklarovať v rovnakom rozsahu. Prototyp funkcie však možno deklarovať viackrát v rovnakom rozsahu. Nasledujúci program s dvoma funkčnými prototypmi a zodpovedajúcou definíciou funkcie to ilustruje:

#include
pomocou namespace std;
void fn (int num);
void fn (int num);
void fn (int num)

cout<
int main ()

fn (5);
návrat 0;

Program funguje.

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

#include
pomocou namespace 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ýstup je:
5
8.7

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

Rozsah menného priestoru

Obor Namespace Scope si zaslúži vlastný článok. Uvedený článok bol napísaný pre tento web, linuxhint.com. Stačí do vyhľadávacieho poľa na tejto stránke (stránke) napísať hľadané slová „Namespace Scope“ a kliknúť na OK, čím získate článok.

Rozsah v rôznych častiach

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

Záver

Rozsah je deklaratívny región. Deklaratívna oblasť je najväčšia časť programového textu, v ktorej je platný názov entity. Môže byť rozdelený na viac ako jednu časť v súlade s určitými programovacími schémami, ako sú napríklad vnorené bloky. Časti, ktoré nemajú bod vyhlásenia, tvoria potenciálny rozsah. Potenciálny rozsah môže, ale nemusí mať vyhlásenie.

Recenzia bezdrôtovej myši Microsoft Sculpt Touch
Nedávno som čítal o Microsoft Sculpt Touch bezdrôtová myš a rozhodol sa ju kúpiť. Po chvíli používania som sa rozhodol s ním podeliť o svoje skúsenost...
Trackpad a ukazovateľ myši AppyMouse na obrazovke pre tablety so systémom Windows
Používateľom tabletov často chýba ukazovateľ myši, najmä keď notebooky bežne používajú. Dotykové smartphony a tablety majú veľa výhod a jediným obmedz...
Stredné tlačidlo myši nefunguje v systéme Windows 10
The stredné tlačidlo myši pomáha vám prechádzať dlhé webové stránky a obrazovky s množstvom údajov. Ak sa to zastaví, budete nakoniec používať klávesn...