Sadržaj članka
- Deklarativna regija i opseg
- Globalni opseg
- Opseg bloka
- Opseg funkcije
- Opseg nabrajanja
- Opseg klase
- Opseg parametra predloška
- Skrivanje imena
- Mogućnost ponavljanja deklaracije u istom opsegu
- Opseg prostora imena
- Opseg u različitim dijelovima
- Zaključak
Deklarativna regija i opseg
Deklarativna regija najveći je dio programskog teksta u kojem je naziv entiteta valjan. To je regija u kojoj se nekvalificirani naziv može koristiti (vidjeti) za upućivanje na isti entitet. Razmotrite sljedeći kratki program:
#uključi
koristeći imenski prostorsati;
poništitifn()
{
intgdje= 3;
ako (1==1)
{
trošak<<gdje<<' n';
}
}
intglavni()
{
fn();
povratak 0;
}
Funkcija fn () ima dva bloka: unutarnji blok za if-uvjet i vanjski blok za tijelo funkcije. Identifikator, var, uveden je i prikazan u vanjskom bloku. Također se vidi u unutarnjem bloku, s cout izjavom. Vanjski i unutarnji blokovi su i područje za ime, var.
Međutim, naziv var i dalje se može koristiti za deklariranje drugačijeg entiteta, poput float -a u unutarnjem bloku. Sljedeći kod to ilustrira:
#uključi
koristeći imenski prostorsati;
poništitifn()
{
intgdje= 3;
ako (1==1)
{
plutatigdje= 7.5;
trošak<<gdje<<' n';
}
}
intglavni()
{
fn();
povratak 0;
}
Izlaz je 7,5. U ovom slučaju, ime, var, više se ne može koristiti u unutarnjem bloku za pozivanje na cijeli broj vrijednosti 3, koji je uveden (deklariran) u vanjskom bloku. Takvi unutarnji blokovi nazivaju se potencijalnim opsegom za entitete deklarirane u vanjskom bloku.
Napomena: Entitet istog tipa, poput entiteta vanjskog bloka, još uvijek se može deklarirati u unutarnjem bloku. Međutim, u ovom slučaju ono što vrijedi u unutarnjem bloku je nova deklaracija i njeno značenje, dok stara deklaracija i njeno značenje izvan unutarnjeg bloka ostaju valjani u vanjskom bloku.
Deklaracija istog imena u unutarnjem bloku obično nadjačava deklaraciju istog imena izvan tog unutarnjeg bloka. Unutarnji blokovi mogu ugnijezditi druge unutarnje blokove.
Globalni opseg
Kada programer tek počne upisivati datoteku, to je globalni opseg. Sljedeći kratki program to ilustrira:
#uključikoristeći imenski prostorsati;
plutatigdje= 9.4;
intglavni()
{
trošak <<gdje<<' n';
trošak <<::gdje<<' n';
povratak 0;
}
Izlaz je:
9.4
9.4
U ovom slučaju deklarativno područje ili opseg za var počinje od točke deklaracije za var, nastavlja se prema dolje do kraja datoteke (jedinica prevođenja).
Blok funkcije main () različit je opseg; to je ugniježđeni opseg za globalni opseg. Za pristup entitetu globalnog opsega, iz drugog opsega, identifikator se koristi izravno ili ispred njega operator razrješenja opsega, ::.
Napomena: Entitet, main (), također je deklariran u globalnom opsegu.
Opseg bloka
Svaki, if, while, do, for, ili switch izraz može definirati blok. Takav iskaz je složeni iskaz. Naziv varijable deklarirane u bloku ima opseg bloka. Njegov opseg počinje na mjestu deklaracije i završava na kraju bloka. Sljedeći kratki program to ilustrira za varijablu, ident:
#uključikoristeći imenski prostorsati;
intglavni()
{
ako (1==1)
{
/*neke izjave*/
intident= 5;
trošak<<ident<<' n';
/*neke izjave*/
}
povratak 0;
}
Varijabla, kao što je ident, deklarirana u opsegu bloka, lokalna je varijabla.
Varijabla deklarirana izvan opsega bloka i iznad nje može se vidjeti u zaglavlju bloka (npr. Uvjet za if-blok), a također i unutar bloka. Sljedeći kratki program to ilustrira za varijablu, identif:
#uključikoristeći imenski prostorsati;
intglavni()
{
intidentif= 8;
ako (identif== 8)
{
trošak<<identif<<' n';
}
povratak 0;
}
Izlaz je 8. Ovdje postoje dva opsega blokova: blok za funkciju main () i ugniježđeni if-složeni izraz. Ugniježđeni blok je potencijalni opseg glavnog () funkcionalnog bloka.
Deklaracija unesena u opseg bloka ne može se vidjeti izvan bloka. Sljedeći kratki program, koji se ne kompajlira, ilustrira to varijablom variab:
#uključikoristeći imenski prostorsati;
intglavni()
{
ako (1 == 1)
{
intvarijab= petnaest;
}
trošak<<varijab<<' n'; // pogreška: pristup izvan opsega.
povratak 0;
}
Prevoditelj proizvodi poruku o pogrešci za variab.
Entitet koji je uveden, deklariran u zaglavlju složene funkcije, ne može se vidjeti izvan (ispod) složenog izraza. Sljedeći kod for-loop neće se kompajlirati, što će rezultirati porukom o pogrešci:
#uključikoristeći imenski prostorsati;
intglavni()
{
za (inti=0;i<4; ++i)
{
trošak<<i<<'';
}
trošak<<i<<'';
povratak 0;
}
Varijabla iteracije, i, vidi se unutar bloka for-loop, ali ne i izvan bloka for-loop.
Opseg funkcije
U funkcijskom bloku vidi se parametar funkcije. Entitet deklariran u funkcionalnom bloku viđen je od točke deklaracije do kraja funkcionalnog bloka. Sljedeći kratki program to ilustrira:
#uključi#uključi
koristeći imenski prostorsati;
niz fn(string str)
{
charstri[] = 'banane';
/*ostale izjave*/
niz ukupnoStr=str+stri;
povratakukupnoStr;
}
intglavni()
{
niz totStr=fn('jesti');
trošak<<totStr<<' n';
povratak 0;
}
Izlaz je:
jedu banane
Napomena: Entitet deklariran izvan funkcije (iznad nje) može se vidjeti u popisu parametara funkcije, a također iu funkcionalnom bloku.
Označiti
Opseg oznake je funkcija u kojoj se pojavljuje. Sljedeći kod to ilustrira:
#uključikoristeći imenski prostorsati;
poništitifn()
{
ićilabl;
/*ostale izjave*/
labl: intne= 2;
trošak<<ne<<' n';
}
intglavni()
{
fn();
povratak 0;
}
Izlaz je 2.
Opseg nabrajanja
Nepregledano nabrajanje
Razmotrite sljedeće if-block:
{
nabrojati {a, b, c=b+2};
trošak<<do<<''<<b<<''<<c<<' n';
}
Izlaz je 0 1 3.
Prvi redak u bloku je popisivanje, a, b i c su njegovi popisivači. Opseg popisivača počinje od točke deklaracije do kraja ogradnog bloka popisivanja.
Sljedeća se izjava neće sastaviti jer je točka deklaracije c iza one od a:
nabrojati {do=c+2, b, c};Sljedeći segment koda neće se kompajlirati jer se popisivačima pristupa nakon zatvorenog bloka nabrajanja:
ako (1==1){
nabrojati {a, b, c=b+2};
}
trošak<<do<<''<<b<<''<<c<<' n'; // pogreška: izvan opsega
Gore navedeno popisivanje opisano je kao nekopirano popisivanje, a njegovi popisivači kao neskopirani popisivači. To je zato što počinje samo rezerviranom riječju, enum. Nabrajanja koja počinju klasom nabrajanja ili strukturom nabrajanja opisana su kao nabrajanja s opsegom. Njihovi popisivači opisani su kao popisivači s opsegom.
Nabrajanje s opsegom
Sljedeća izjava je u redu:
Ovo je primjer opsežnog popisivanja. Ime klase je nam. Ovdje opseg popisivača počinje od točke deklaracije do kraja definicije nabrajanja, a ne od kraja bloka koji obuhvaća popisivanje. Sljedeći se kod neće kompilirati:
ako (1==1){
nabrojati razredmuški{a, b, c=b+2};
trošak<<do<<''<<b<<''<<c<<' n'; // pogreška: izvan opsega za enum class ili enum struct
}
Opseg klase
S normalnim opsegom, deklarativno područje počinje od točke, zatim se nastavlja i zaustavlja na drugoj točki. Opseg postoji u jednoj kontinuiranoj regiji. S klasom, opseg entiteta može biti u različitim regijama koje nisu spojene zajedno. Pravila za ugniježđene blokove i dalje vrijede. Sljedeći program to ilustrira:
#uključikoristeći imenski prostorsati;
// Osnovna klasa
razredCla
{
privatna:
intmemP= 5;
zaštićen:
intmemPro= 9;
javnost:
poništitifn()
{
trošak<<memP<<' n';
}
};
// Izvedena klasa
razredDerCla: javnostCla
{
javnost:
intderMem=memPro;
};
intglavni()
{
Cla obj;
obj.fn();
DerCla derObj;
trošak<<derObj.derMem<<' n';
povratak 0;
}
Izlaz je:
5
9
U klasi Cla varijabla memP se vidi na mjestu deklaracije. Nakon toga, kratki dio zaštićenog se preskače, a zatim ponovno vidi u funkcionalnom bloku člana klase. Izvedena klasa se preskače, a zatim ponovno vidi u opsegu (bloku) funkcije main ().
U klasi Cla, varijabla memPro, vidi se na mjestu deklaracije. Dio javne funkcije fn () se preskače, a zatim vidi u izvedenom bloku opisa klase. Ponovno se vidi dolje u funkciji main ().
Operator razrješenja opsega
Operator razrješenja opsega u C ++ je ::. Koristi se za pristup statičkom članu klase. Sljedeći program to ilustrira:
koristeći imenski prostorsati;
razredCla
{
javnost:
statički int konstmeme= 5;
javnost:
statički poništitifn()
{
trošak<<meme<<' n';
}
};
intglavni()
{
trošak<<Cla::meme<<' n';
Cla::fn();
povratak 0;
}
Izlaz je:
5
5
Statički članovi se vide u glavnom () funkcionalnom bloku, kojem se pristupa pomoću operatora razlučivosti opsega.
Opseg parametra predloška
Uobičajeni opseg naziva parametra predloška počinje od točke deklaracije do kraja njegovog bloka, kao u sljedećem kodu:
predložak<typenameT,typenameU> structDoba{
T Ivan= jedanaest;
Ti Petre= 12.3;
T Marija= 13;
U radosti= 14.6;
};
U i T se vide unutar bloka.
Za prototip funkcije predloška opseg počinje od točke deklaracije do kraja popisa parametara funkcije, kao u sljedećoj izjavi:
predložak<typenameT,typenameU> poništitifunkcija(Ti ne, ča,konst char *str);Međutim, što se tiče opisa klase (definicije), opseg također može biti različitih dijelova kao u sljedećem kodu:
#uključikoristeći imenski prostorsati;
predložak<razredT,razredU> razredTheCla
{
javnost:
t num;
statičkiU gl;
poništitifunkcija(Ti oče,konst char *str)
{
trošak << 'Tamo su ' <<na jedan<< 'knjige vrijedne' <<Ne<<str<< ' u trgovini.' << ' n';
}
statički poništitizabava(U gl)
{
ako (CH== 'do')
trošak << 'Službena statička funkcija člana' << ' n';
}
};
intglavni()
{
TheCla<int,char>obj;
obj.na jedan = 12;
obj.funkcija('$','500');
povratak 0;
}
Skrivanje imena
Primjer skrivanja imena događa se kada se naziv iste vrste objekta ponovno deklarira u ugniježđenom bloku. Sljedeći program to ilustrira:
#uključikoristeći imenski prostorsati;
poništitifn()
{
intgdje= 3;
ako (1==1)
{
intgdje= 4;
trošak<<gdje<<' n';
}
trošak<<gdje<<' n';
}
intglavni()
{
fn();
povratak 0;
}
Izlaz je:
4
3
To je zato što je var u ugniježđenom bloku sakrio var u vanjskom bloku.
Mogućnost ponavljanja deklaracije u istom opsegu
Točka deklaracije je mjesto gdje se naziv uvodi (po prvi put) u svoj opseg.
Prototip funkcije
Različiti entiteti, čak i različitih vrsta, normalno se ne mogu deklarirati u istom opsegu. Međutim, prototip funkcije može se deklarirati više puta u istom opsegu. Sljedeći program s dva prototipa funkcija i odgovarajućom definicijom funkcije to ilustrira:
koristeći imenski prostorsati;
poništitifn(intna jedan);
poništitifn(intna jedan);
poništitifn(intna jedan)
{
trošak<<na jedan<<' n';
}
intglavni()
{
fn(5);
povratak 0;
}
Program radi.
Preopterećene funkcije
Preopterećene funkcije su funkcije s istim imenom, ali različitim potpisima funkcija. Kao druga iznimka, preopterećene funkcije s istim imenom mogu se definirati u istom opsegu. Sljedeći program to ilustrira:
koristeći imenski prostorsati;
poništitifn(intna jedan)
{
trošak<<na jedan<<' n';
}
poništitifn(plutatiNe)
{
trošak<<Ne<<' n';
}
intglavni()
{
fn(5);
plutatiflt= 8.7;
fn(flt);
povratak 0;
}
Izlaz je:
5
8.7
Preopterećene funkcije definirane su u globalnom opsegu.
Opseg prostora imena
Namespace Scope zaslužuje vlastiti članak. Navedeni članak je napisan za ovu web stranicu, linuxhint.com. Samo upišite riječi za pretraživanje Namespace Scope u okvir za pretraživanje ove stranice (stranice) i kliknite U redu, i dobit ćete članak.
Opseg u različitim dijelovima
Klasa nije jedina shema u kojoj opseg može biti u različitim dijelovima. Prijateljski specifikator, određene uporabe specificiranog specifikatora tipa i direktive korištenja druge su sheme u kojima je opseg na različitim mjestima-za detalje pogledajte kasnije.
Zaključak
Opseg je deklarativna regija. Deklarativna regija najveći je dio programskog teksta u kojem je naziv entiteta valjan. Može se podijeliti na više dijelova u skladu s određenim programskim shemama, poput ugniježđenih blokova. Dijelovi koji nemaju točku deklaracije tvore potencijalni opseg. Potencijalni opseg može, ali i ne mora sadržavati deklaraciju.