Področje uporabe v C ++

Scope C



Entiteta v C ++ ima ime, ki ga je mogoče razglasiti in/ali definirati. Izjava je definicija, vendar definicija ni nujno deklaracija. Definicija dodeljuje pomnilnik imenovani entiteti, deklaracija pa lahko dodeljuje pomnilnik imenovani entiteti ali pa tudi ne. Deklarativna regija je največji del programa, v katerem je ime entitete (spremenljivke) veljavno. To območje imenujemo obseg ali potencialni obseg. Ta članek razlaga področje uporabe v C ++. Poleg tega je za razumevanje tega članka potrebno osnovno znanje jezika C ++.

Vsebina članka

Deklarativna regija in področje uporabe

Deklarativna regija je največji del besedila programa, v katerem je ime subjekta veljavno. To je regija, v kateri se lahko nekvalificirano ime uporablja (vidi) za sklicevanje na isto entiteto. Razmislite o naslednjem kratkem programu:







#vključi
z uporabo imenski prostorure;

ničnofn()
{
intkje= 3;
če (1==1)
{
stroški<<kje<<' n';
}
}

intglavni()
{
fn();
vrnitev 0;
}

Funkcija fn () ima dva bloka: notranji blok za if-pogoj in zunanji blok za telo funkcije. Identifikator, var, je predstavljen in viden v zunanjem bloku. Vidno je tudi v notranjem bloku z izjavo cout. Zunanji in notranji blok sta obseg imena, var.



Vendar pa lahko ime var še vedno uporabimo za razglasitev drugačne entitete, kot je na primer plavajoče v notranjem bloku. Naslednja koda ponazarja to:



#vključi
z uporabo imenski prostorure;

ničnofn()
{
intkje= 3;
če (1==1)
{
plavatikje= 7.5;
stroški<<kje<<' n';
}
}

intglavni()
{
fn();
vrnitev 0;
}

Izhod je 7,5. V tem primeru imena var ni mogoče več uporabiti v notranjem bloku za sklicevanje na celo število vrednosti 3, ki je bilo vneseno (deklarirano) v zunanjem bloku. Takšni notranji bloki se imenujejo potencialni obseg za subjekte, deklarirane v zunanjem bloku.





Opomba: Entiteto iste vrste, podobno kot pri zunanjem bloku, je še vedno mogoče razglasiti v notranjem bloku. V tem primeru pa velja v notranjem bloku nova deklaracija in njen pomen, medtem ko stara deklaracija in njen pomen zunaj notranjega bloka ostaneta veljavna v zunanjem bloku.

Izjava z istim imenom v notranjem bloku običajno preglasi deklaracijo z istim imenom zunaj tega notranjega bloka. Notranji bloki lahko gnezdijo druge notranje bloke.



Globalni obseg

Ko programer šele začne vnašati datoteko, je to globalno področje uporabe. Naslednji kratek program ponazarja to:

#vključi
z uporabo imenski prostorure;

plavatikje= 9.4;

intglavni()
{
stroški <<kje<<' n';
stroški <<::kje<<' n';

vrnitev 0;
}

Izhod je:
9.4
9.4

V tem primeru se deklarativno območje ali obseg za var začne od točke deklaracije za var in se nadaljuje navzdol do konca datoteke (prevodna enota).

Blok funkcije main () je drugačen obseg; je ugnezdeno področje za globalno področje uporabe. Za dostop do entitete globalnega področja uporabe iz drugega obsega se identifikator uporablja neposredno ali pred njim z operaterjem ločljivosti obsega, ::.

Opomba: Entiteta main () je tudi deklarirana v globalnem obsegu.

Področje blokiranja

Vsaka izjava if, while, do, for ali switch lahko definira blok. Takšna trditev je sestavljena. Ime spremenljivke, deklarirane v bloku, ima obseg bloka. Njegov obseg se začne na točki izjave in konča na koncu bloka. Naslednji kratek program ponazarja to za spremenljivko ident:

#vključi
z uporabo imenski prostorure;

intglavni()
{
če (1==1)
{
/*nekaj izjav*/
intident= 5;
stroški<<ident<<' n';
/*nekaj izjav*/
}
vrnitev 0;
}

Spremenljivka, kot je ident, deklarirana v obsegu bloka, je lokalna spremenljivka.

Spremenljivko, deklarirano zunaj obsega bloka in nad njo, je mogoče videti v glavi bloka (npr. Pogoj za if-blok) in tudi znotraj bloka. Naslednji kratek program ponazarja to za spremenljivko, identif:

#vključi
z uporabo imenski prostorure;

intglavni()
{
intidentif= 8;

če (identif== 8)
{
stroški<<identif<<' n';
}
vrnitev 0;
}

Izhod je 8. Tukaj sta dva področja blokov: blok za funkcijo main () in ugnezdeni stavek if-sestavljen. Gnezdeni blok je potencialni obseg funkcijskega bloka main ().

Deklaracije, uvedene v obsegu bloka, ni mogoče videti zunaj bloka. Naslednji kratek program, ki se ne prevaja, ponazarja to s spremenljivko variab:

#vključi
z uporabo imenski prostorure;

intglavni()
{
če (1 == 1)
{
intvariab= petnajst;
}
stroški<<variab<<' n'; // napaka: dostopa izven njenega obsega.

vrnitev 0;
}

Prevajalnik prikaže sporočilo o napaki za variab.

Uvedene entitete, navedene v glavi sestavljene funkcije, ni mogoče videti zunaj (pod) sestavljene izjave. Naslednja koda for zanke se ne bo prevedla, kar bo povzročilo sporočilo o napaki:

#vključi
z uporabo imenski prostorure;

intglavni()
{
za (intjaz=0;jaz<4; ++jaz)
{
stroški<<jaz<<'';
}
stroški<<jaz<<'';

vrnitev 0;
}

Spremenljivka ponovitve, i, je vidna znotraj bloka for-loop, ne pa tudi zunaj bloka for-loop.

Področje delovanja

V funkcijskem bloku je prikazan funkcijski parameter. Entiteta, deklarirana v funkcijskem bloku, je vidna od točke deklaracije do konca funkcionalnega bloka. Naslednji kratek program ponazarja to:

#vključi
#vključi
z uporabo imenski prostorure;

niz fn(niz str)
{
charstri[] = 'banane';
/*druge izjave*/
niz totalStr=str+stri;
vrnitevskupajStr;
}

intglavni()
{
niz totStr=fn('jesti');
stroški<<totStr<<' n';

vrnitev 0;
}

Izhod je:
jedo banane

Opomba: Entiteto, deklarirano zunaj funkcije (nad njo), je mogoče videti na seznamu parametrov funkcije in tudi v funkcionalnem bloku.

Oznaka

Področje uporabe oznake je funkcija, v kateri je prikazana. Naslednja koda ponazarja to:

#vključi
z uporabo imenski prostorure;

ničnofn()
{
Pojdi dolabl;
/*druge izjave*/
labl: intne= 2;
stroški<<ne<<' n';
}

intglavni()
{
fn();

vrnitev 0;
}

Izhod je 2.

Področje štetja

Nepreverjeno štetje
Upoštevajte naslednje if-block:

če (1==1)
{
naštej {a, b, c=b+2};
stroški<<do<<''<<b<<''<<c<<' n';
}

Izhod je 0 1 3.

Prva vrstica v bloku je naštevanje, a, b in c so njegovi števci. Obseg števca se začne od točke deklaracije do konca ogradnega bloka naštevanja.

Naslednja izjava se ne bo sestavila, ker je točka deklaracije c za točko a:

naštej {do=c+2, b, c};

Naslednji kodni segment se ne bo prevedel, ker do enumeratorjev dostopate po obrobnem bloku naštevanja:

če (1==1)
{
naštej {a, b, c=b+2};
}
stroški<<do<<''<<b<<''<<c<<' n'; // napaka: izven področja uporabe

Zgornje naštevanje je opisano kot nezaščiteno naštevanje, njegovi naštevalniki pa kot nedekonirani. To pa zato, ker se začne le z rezervirano besedo, enum. Naštevanja, ki se začnejo z razredom enum ali strukturo enum, so opisana kot področja naštevanja. Njihovi števci so opisani kot števci.

Obseg naštevanja
Naslednja trditev je v redu:

naštej razredmoški{a, b, c=b+2};

To je primer obsežnega štetja. Ime razreda je nam. Obseg števca se tukaj začne od točke deklaracije do konca opredelitve štetja in ne od konca bloka, ki ga je treba vključiti. Naslednja koda se ne bo prevedla:

če (1==1)
{
naštej razredmoški{a, b, c=b+2};
stroški<<do<<''<<b<<''<<c<<' n'; // napaka: izven obsega za enum class ali enum struct
}

Področje uporabe razreda

Pri običajnem obsegu se deklarativno območje začne od točke, nato nadaljuje in se ustavi na drugi točki. Obseg obstaja v enem neprekinjenem območju. S razredom je lahko področje uporabe entitete v različnih regijah, ki niso združene. Pravila za ugnezdene bloke še vedno veljajo. Naslednji program to ponazarja:

#vključi
z uporabo imenski prostorure;

// Osnovni razred
razredCla
{
zasebno:
intmemP= 5;
zaščiteno:
intmemPro= 9;
javno:
ničnofn()
{
stroški<<memP<<' n';
}
};

// Izpeljani razred
razredDerCla: javnoCla
{
javno:
intderMem=memPro;
};
intglavni()
{
Cla obj;
obj.fn();
DerCla derObj;
stroški<<derObj.derMem<<' n';

vrnitev 0;
}

Izhod je:
5
9

V razredu Cla je spremenljivka memP vidna na mestu deklaracije. Po tem se kratek del zaščite preskoči in nato ponovno vidi v funkcijskem bloku člana razreda. Izpeljani razred se preskoči in nato ponovno vidi v obsegu (bloku) funkcije main ().

V razredu Cla je spremenljivka memPro vidna na mestu deklaracije. Del javne funkcije fn () je preskočen, nato pa viden v bloku opisa izpeljanega razreda. To je spet prikazano v funkciji main ().

Operater za reševanje področja uporabe
Operator ločljivosti obsega v C ++ je ::. Uporablja se za dostop do statičnega člana razreda. Naslednji program to ponazarja:

#vključi
z uporabo imenski prostorure;

razredCla
{
javno:
statična int constmeme= 5;
javno:
statična ničnofn()
{
stroški<<meme<<' n';
}
};
intglavni()
{
stroški<<Cla::meme<<' n';
Cla::fn();

vrnitev 0;
}

Izhod je:
5
5

Statični člani so vidni v glavnem () funkcionalnem bloku, do katerih dostopate z operaterjem ločljivosti obsega.

Področje uporabe parametra predloge

Običajni obseg imena parametra predloge se začne od točke deklaracije do konca bloka, kot v naslednji kodi:

predlogo<typenameT,typenameU> structStarost
{
T Janez= enajst;
Ti Peter= 12.3;
T Marija= 13;
U veselje= 14.6;
};

U in T sta vidna znotraj bloka.

Za prototip funkcije predloge se obseg začne od točke razglasitve do konca seznama parametrov funkcije, kot v naslednji izjavi:

predlogo<typenameT,typenameU> ničnofunkcijo(Ti ne, ča,const char *str);

Ko pa gre za opis razreda (definicijo), je lahko področje uporabe tudi različnih delov, kot je v naslednji kodi:

#vključi
z uporabo imenski prostorure;

predlogo<razredT,razredU> razredTheCla
{
javno:
t št;
statičnaU ch;

ničnofunkcijo(Ti oče,const char *str)
{
stroški << 'Obstajajo' <<na enem<< 'knjige vredne' <<ne<<str<< 'v trgovini.' << ' n';
}
statična ničnozabavno(U ch)
{
če (pogl== 'do')
stroški << 'Uradna statična funkcija člana' << ' n';
}
};

intglavni()
{
TheCla<int,char>obj;
obj.na enem = 12;
obj.funkcijo('$','500');

vrnitev 0;
}

Skrivanje imena

Primer skrivanja imen se pojavi, ko je ime iste vrste objekta ponovno deklarirano v ugnezdenem bloku. Naslednji program to ponazarja:

#vključi
z uporabo imenski prostorure;

ničnofn()
{
intkje= 3;
če (1==1)
{
intkje= 4;
stroški<<kje<<' n';
}
stroški<<kje<<' n';
}

intglavni()
{
fn();
vrnitev 0;
}

Izhod je:
4
3

To je zato, ker je var v ugnezdenem bloku skril var v zunanjem bloku.

Možnost ponovitve izjave na istem področju

Točka deklaracije je tam, kjer je ime (prvič) vneseno v njegovo področje uporabe.

Prototip funkcije
Različnih subjektov, tudi različnih vrst, običajno ni mogoče razglasiti v istem obsegu. Vendar pa je prototip funkcije mogoče razglasiti več kot enkrat v istem obsegu. Naslednji program z dvema prototipoma funkcij in ustrezno definicijo funkcije to ponazarja:

#vključi
z uporabo imenski prostorure;

ničnofn(intna enem);
ničnofn(intna enem);

ničnofn(intna enem)
{
stroški<<na enem<<' n';
}

intglavni()
{
fn(5);

vrnitev 0;
}

Program deluje.

Preobremenjene funkcije
Preobremenjene funkcije so funkcije z istim imenom, vendar različnimi podpisi funkcij. Druga izjema je, da lahko preobremenjene funkcije z istim imenom definiramo v istem obsegu. Naslednji program to ponazarja:

#vključi
z uporabo imenski prostorure;

ničnofn(intna enem)
{
stroški<<na enem<<' n';
}

ničnofn(plavatine)
{
stroški<<ne<<' n';
}

intglavni()
{
fn(5);
plavatiflt= 8.7;
fn(flt);

vrnitev 0;
}

Izhod je:
5
8.7

Preobremenjene funkcije so opredeljene v globalnem obsegu.

Področje uporabe imenskega prostora

Področje imenskega prostora si zasluži lasten članek. Omenjeni članek je bil napisan za to spletno stran, linuxhint.com. V iskalno polje tega spletnega mesta (strani) samo vnesite iskalne besede Namespace Scope in kliknite V redu, da dobite članek.

Obseg v različnih delih

Razred ni edina shema, kjer je obseg lahko v različnih delih. Prijateljski specifikator, določene uporabe opredeljenega specifikatorja tipa in direktive o uporabi so druge sheme, kjer je področje uporabe na različnih mestih-podrobnosti si oglejte kasneje.

Zaključek

Področje uporabe je deklarativno območje. Deklarativna regija je največji del besedila programa, v katerem je ime subjekta veljavno. V skladu z določenimi programskimi shemami, kot so ugnezdeni bloki, ga lahko razdelimo na več delov. Deli, ki nimajo točke deklaracije, tvorijo potencialno področje uporabe. Potencialno področje uporabe lahko vsebuje izjavo ali pa tudi ne.