Opseg u C ++

Scope C



Entitet u C ++ ima naziv koji se može deklarirati i/ili definirati. Deklaracija je definicija, ali definicija nije nužno deklaracija. Definicija dodjeljuje memoriju imenovanom entitetu, ali deklaracija može, ali i ne mora dodijeliti memoriju imenovanom entitetu. Deklarativna regija najveći je dio programa u kojem je naziv entiteta (varijabla) ispravan. To se područje naziva opsegom ili potencijalnim opsegom. Ovaj članak objašnjava opseg u C ++. Nadalje, za razumijevanje ovog članka potrebno je osnovno znanje jezika C ++.

Sadržaj članka

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či
koristeć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či
koristeć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či
koristeć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či
koristeć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či
koristeć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či
koristeć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:

ako (1==1)
{
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:

nabrojati razredmuški{a, b, c=b+2};

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či
koristeć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:

#uključi
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či
koristeć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či
koristeć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:

#uključi
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:

#uključi
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.