C ++

Opseg u C ++

Opseg u C ++
Entitet u C ++-u ima ime koje se može deklarirati i / ili definirati. Deklaracija je definicija, ali definicija nije nužno deklaracija. Definicija dodjeljuje memoriju za imenovani entitet, ali deklaracija može dodijeliti memoriju za imenovani entitet, ali ne mora. Deklarativna regija najveći je dio programa u kojem vrijedi naziv entiteta (varijable). Ta se regija naziva opseg ili potencijalni opseg. Ovaj članak objašnjava opseg u C++. Nadalje, za razumijevanje ovog članka potrebno je osnovno znanje na jeziku C ++.

Sadržaj članka

Deklarativna regija i opseg

Deklarativna regija najveći je dio programskog teksta u kojem vrijedi naziv entiteta. To je regija u kojoj se nekvalificirani naziv može koristiti (vidjeti) za upućivanje na isti entitet. Razmotrite sljedeći kratki program:

#include
pomoću prostora imena std;
void fn ()

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

cout<

int main ()

fn ();
return 0;

Funkcija fn () ima dva bloka: unutarnji blok za uvjet if i vanjski blok za tijelo funkcije. Identifikator, var, uveden je i vidljiv u vanjskom bloku. Također se vidi u unutarnjem bloku, s izjavom o coutu. Vanjski i unutarnji blok opseg su imena, var.

Međutim, ime, var, i dalje se može koristiti za deklariranje drugog entiteta, poput float-a u unutarnjem bloku. Sljedeći kod to ilustrira:

#include
pomoću prostora imena std;
void fn ()

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

plutajuća var = 7.5;
cout<

int main ()

fn ();
return 0;

Izlaz je 7.5. U ovom slučaju, naziv var više se ne može koristiti u unutarnjem bloku za upućivanje na cijeli broj vrijednosti 3, koji je uveden (deklariran) u vanjskom bloku. Takvi se unutarnji blokovi nazivaju potencijalnim opsegom za entitete deklarirane u vanjskom bloku.

Napomena: Entitet istog tipa, poput onog 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 njezino značenje, dok stara deklaracija i njezino značenje izvan unutarnjeg bloka ostaju valjani u vanjskom bloku.

Deklaracija istog imena u unutarnjem bloku obično nadjačava istoimenu deklaraciju izvan tog unutarnjeg bloka. Unutarnji blokovi mogu ugnijezditi druge unutarnje blokove.

Globalni opseg

Kad programer tek počne tipkati datoteku, to je globalni opseg. Sljedeći kratki program to ilustrira:

#include
pomoću prostora imena std;
plutajuća var = 9.4;
int main ()

cout <cout <<::var<<'\n';
return 0;

Izlaz je:
9.4
9.4

U ovom slučaju, deklarativno područje ili opseg za var započinje od točke deklaracije za var, nastavlja se prema dolje do kraja datoteke (jedinica za prijevod).

Blok funkcije main () različitog je opsega; to je ugniježđeno područje za globalni opseg. Za pristup entitetu globalnog opsega iz drugog opsega, identifikator se koristi izravno ili mu prethodi operator razlučivanja opsega, :: .

Napomena: Entitet, main (), također je deklariran u globalnom opsegu.

Opseg bloka

Izraz if, while, do, for ili switch može definirati svaki blok. Takva je izjava složena izjava. Ime varijable deklarirane u bloku ima opseg bloka. Njegov opseg započinje na mjestu deklaracije i završava na kraju bloka. Sljedeći kratki program to ilustrira za varijablu ident:

#include
pomoću prostora imena std;
int main ()

ako (1 == 1)

/ * neke izjave * /
int ident = 5;
cout</ * neke izjave * /

return 0;

Varijabla, poput ident, deklarirana u opsegu bloka, lokalna je varijabla.

Varijabla deklarirana izvan opsega bloka i iznad nje može se vidjeti u zaglavlju bloka (npr.g., uvjet za if-block) i također unutar bloka. Sljedeći kratki program to ilustrira za varijablu, identif:

#include
pomoću prostora imena std;
int main ()

int identif = 8;
ako (identif == 8)

cout<
return 0;

Izlaz je 8. Ovdje postoje dva opsega bloka: blok za glavnu () funkciju i ugniježđeni if-complex izraz. Ugniježđeni blok je potencijalni opseg glavnog () funkcijskog bloka.

Deklaracija unesena u opseg bloka ne može se vidjeti izvan bloka. Sljedeći kratki program, koji se ne kompajlira, to ilustrira varijablom variab:

#include
pomoću prostora imena std;
int main ()

ako (1 == 1)

int varijab = 15;

cout<return 0;

Prevodnik stvara poruku pogreške za variab.

Uvedeni entitet, deklariran u zaglavlju složene funkcije, ne može se vidjeti izvan (ispod) složenog izraza. Sljedeći kôd for-loop neće se prevesti, što rezultira porukom o pogrešci:

#include
pomoću prostora imena std;
int main ()

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

cout<
cout<return 0;

Varijabla iteracije, i, vidi se unutar for-loop bloka, ali ne i izvan for-loop bloka.

Opseg funkcije

Funkcijski parametar se vidi u funkcijskom bloku. Entitet deklariran u funkcijskom bloku vidi se od točke deklaracije do kraja funkcijskog bloka. Sljedeći kratki program to ilustrira:

#include
#include
pomoću prostora imena std;
niz fn (niz str)

char stri [] = "banane";
/ * ostale izjave * /
niz totalStr = str + stri;
povratak totalStr;

int main ()

niz totStr = fn ("jesti");
cout<return 0;

Izlaz je:
jedući banane

Napomena: Entitet deklariran izvan funkcije (iznad nje) može se vidjeti na popisu parametara funkcije, a također i u funkcijskom bloku.

Označiti

Opseg oznake je funkcija u kojoj se pojavljuje. Sljedeći kod to ilustrira:

#include
pomoću prostora imena std;
void fn ()

ići na labl;
/ * ostale izjave * /
labl: int inte = 2;
cout<
int main ()

fn ();
return 0;

Izlaz je 2.

Opseg popisa

Nekopirano popisivanje
Razmotrite sljedeći if-block:

ako (1 == 1)

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

Izlaz je 0 1 3.

Prvi redak u bloku je nabrajanje, a, b i c su njegovi popisivači. Opseg popisivača započinje od točke deklaracije do kraja priloženog bloka popisivanja.

Sljedeća se izjava neće sastaviti jer je točka deklaracije c iza točke a:

nabrojati a = c + 2, b, c;

Sljedeći segment koda neće se kompajlirati jer se popisivačima pristupa nakon priloženog bloka nabrajanja:

ako (1 == 1)

nabrajati a, b, c = b + 2;

cout<Gornje nabrajanje opisano je kao nekontrolirano nabrajanje, a njegovi popisivači kao neograničeno nabrajanje. To je zato što započinje samo rezerviranom riječi enum. Nabrajanja koja počinju s enum klasom ili enum strukturom opisuju se kao opsežne enumeracije. Njihovi popisivači opisani su kao popisivači s opsegom.

Opseg popisivanja
Sljedeća izjava je u redu:

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

Ovo je primjer popisa s opsegom. Naziv klase je nam. Ovdje opseg popisivača počinje od točke deklaracije do kraja definicije popisivanja, a ne od kraja priloženog bloka za nabrajanje. Sljedeći kod se neće kompajlirati:

ako (1 == 1)

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

Opseg razreda

Normalnim opsegom, deklarativno područje započinje od točke, a zatim se nastavlja i zaustavlja u drugoj točki. Opseg postoji u jednoj kontinuiranoj regiji. S klasom opseg entiteta može biti u različitim regijama koje nisu spojene. Pravila za ugniježđene blokove i dalje vrijede. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
// Osnovna klasa
razred Cla

privatni:
int memP = 5;
zaštićen:
int memPro = 9;
javnost:
void fn ()

cout<
;
// Izvedena klasa
razred DerCla: javni Cla

javnost:
int derMem = memPro;
;
int main ()

Cla obj;
obj.fn ();
DerCla derObj;
cout<return 0;

Izlaz je:
5
9

U klasi Cla, na mjestu deklaracije vidi se varijabla memP. Nakon toga, kratki dio "zaštićenog" se preskače, a zatim ponovno vidi u funkcijskom bloku člana klase. Izvedena klasa se preskače, a zatim ponovno vidi u opsegu funkcije main () (blok).

U klasi Cla, varijabla memPro, vidi se na mjestu deklaracije. Dio javne funkcije fn () preskače se, a zatim vidi u izvedenom bloku opisa klase. To se ponovno vidi dolje u main () funkciji.

Operator za razlučivanje opsega
Operator razlučivosti opsega na C ++ je: . Koristi se za pristup statičnom članu klase. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
razred Cla

javnost:
statički int const mem = 5;
javnost:
statička praznina fn ()

cout<
;
int main ()

cout<Cla :: fn ();
return 0;

Izlaz je:
5
5

Statični članovi vide se u glavnom () funkcijskom bloku, kojem se pristupa pomoću operatora razlučivanja opsega.

Opseg parametra predloška

Uobičajeni opseg imena parametra predloška započinje od točke deklaracije do kraja njegovog bloka, kao u sljedećem kodu:

predložak strukturna Doba

T Ivan = 11;
U Petru = 12.3;
T Marija = 13;
U Radost = 14.6;
;

U i T se vide unutar bloka.

Za prototip funkcije predloška, ​​opseg započinje od točke deklaracije do kraja popisa parametara funkcije, kao u sljedećoj izjavi:

predložak void func (T ne, U cha, const 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:

#include
pomoću prostora imena std;
predložak razred TheCla

javnost:
T broj;
statički U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

zabava u statičkoj praznini (U ch)

ako (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

Skrivanje imena

Primjer skrivanja imena događa se kada se ime iste vrste objekta ponovno deklarira u ugniježđenom bloku. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
void fn ()

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

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

fn ();
return 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

Poanta deklaracije je mjesto gdje se ime (prvi put) uvodi u svoj opseg.

Prototip funkcije
Različiti entiteti, čak i različitih vrsta, obično se ne mogu prijaviti u istom opsegu. Međutim, prototip funkcije može se deklarirati više puta u istom opsegu. Sljedeći program s dva prototipa funkcije i odgovarajućom definicijom funkcije to ilustrira:

#include
pomoću prostora imena std;
praznina fn (int num);
praznina fn (int num);
praznina fn (int broj)

cout<
int main ()

fn (5);
return 0;

Program radi.

Preopterećene funkcije
Preopterećene funkcije su funkcije s istim imenom, ali različitim potpisima funkcija. Kao još jedna iznimka, preopterećene funkcije s istim imenom mogu se definirati u istom opsegu. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
praznina fn (int broj)

cout<
praznina fn (plutajući br)

cout<
int main ()

fn (5);
float flt = 8.7;
fn (flt);
return 0;

Izlaz je:
5
8.7

Preopterećene funkcije definirane su u globalnom opsegu.

Opseg prostora imena

Opseg imena zaslužuje vlastiti članak. Spomenuti članak napisan je za ovu web stranicu, linuxhint.com. Jednostavno upišite riječi za pretraživanje "Opseg prostora imena" 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. Specifikator prijatelja, određene primjene razrađenog specifikatora tipa i direktive using druge su sheme u kojima je opseg na različitim mjestima - detalje pogledajte kasnije.

Zaključak

Opseg je deklarativna regija. Deklarativna regija najveći je dio programskog teksta u kojem vrijedi naziv entiteta. 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 čine potencijalni opseg. Potencijalni opseg može ili ne mora sadržavati izjavu.

Kako instalirati League Of Legends na Ubuntu 14.04
Ako ste ljubitelj League of Legends, ovo je prilika za vas da testirate League of Legends. Imajte na umu da je LOL podržan na PlayOnLinux ako ste kori...
Instalirajte najnoviju strategiju igre OpenRA na Ubuntu Linux
OpenRA je Libre / Free Real Time strateški pokretač igre koji stvara rane Westwoodove igre poput klasične Command & Conquer: Red Alert. Distribuirani ...
Instalirajte najnoviji Dolphin Emulator za Gamecube i Wii na Linux
Dolphin Emulator omogućuje vam igranje odabranih Gamecube i Wii igara na Linux osobnim računalima (PC). Dolphin Emulator je slobodno dostupan i emula...