Darbības joma C ++

Scope C



C ++ vienībai ir nosaukums, kuru var deklarēt un/vai definēt. Deklarācija ir definīcija, bet definīcija ne vienmēr ir deklarācija. Definīcija piešķir atmiņu nosauktajai entītijai, bet deklarācija var vai nevar piešķirt atmiņu nosauktajai entītijai. Deklarējošais reģions ir lielākā programmas daļa, kurā ir derīgs entītijas nosaukums (mainīgais). Šo reģionu sauc par darbības jomu vai potenciālu. Šajā rakstā ir izskaidrota darbības joma C ++. Turklāt, lai saprastu šo rakstu, ir nepieciešamas pamatzināšanas C ++ valodā.

Raksta saturs

Deklaratīvais reģions un darbības joma

Deklarējošais reģions ir lielākā programmas teksta daļa, kurā ir derīgs entītijas nosaukums. Tas ir reģions, kurā nekvalificētu nosaukumu var izmantot (redzēt), lai atsauktos uz to pašu entītiju. Apsveriet šādu īsu programmu:







#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn()
{
intkur= 3;
ja (1==1)
{
izmaksas<<kur<<' n';
}
}

intgalvenais()
{
fn();
atgriezties 0;
}

Funkcijai fn () ir divi bloki: iekšējais bloks nosacījumam if un ārējais bloks funkcijas korpusam. Identifikators var tiek ieviests un redzams ārējā blokā. Tas ir redzams arī iekšējā blokā ar paziņojumu cout. Ārējais un iekšējais bloks ir gan nosaukuma darbības joma, var.



Tomēr nosaukumu var joprojām var izmantot, lai deklarētu citu entītiju, piemēram, pludiņu iekšējā blokā. To ilustrē šāds kods:



#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn()
{
intkur= 3;
ja (1==1)
{
peldētkur= 7.5;
izmaksas<<kur<<' n';
}
}

intgalvenais()
{
fn();
atgriezties 0;
}

Rezultāts ir 7,5. Šajā gadījumā nosaukumu var vairs nevar izmantot iekšējā blokā, lai atsauktos uz veselu skaitli ar vērtību 3, kas tika ieviesta (deklarēta) ārējā blokā. Šādus iekšējos blokus sauc par potenciālu darbības jomu entītijām, kas deklarētas ārējā blokā.





Piezīme. Tā paša veida entītiju, tāpat kā ārējo bloku, joprojām var deklarēt iekšējā blokā. Tomēr šajā gadījumā iekšējā blokā ir derīga jaunā deklarācija un tās nozīme, savukārt vecā deklarācija un tās nozīme ārpus iekšējā bloka paliek spēkā ārējā blokā.

Tā paša nosaukuma deklarācija iekšējā blokā parasti ignorē tāda paša nosaukuma deklarāciju ārpus šī iekšējā bloka. Iekšējie bloki var ligzdot citus iekšējos blokus.



Globālā darbības joma

Kad programmētājs tikko sāk rakstīt failu, tā ir globālā darbības joma. To ilustrē šāda īsa programma:

#iekļaut
izmantojot vārda telpastundas;

peldētkur= 9.4;

intgalvenais()
{
izmaksas <<kur<<' n';
izmaksas <<::kur<<' n';

atgriezties 0;
}

Rezultāts ir šāds:
9.4
9.4

Šādā gadījumā deklaratīvais reģions vai darbības joma var sākas no var deklarēšanas punkta, turpinās lejup līdz faila (tulkošanas vienības) beigām.

Galvenās () funkcijas bloks ir atšķirīgs tvērums; tā ir globāla darbības joma. Lai piekļūtu globālās darbības jomas entītijai no citas darbības jomas, identifikatoru izmanto tieši vai pirms tā darbības jomas izšķirtspējas operators ::.

Piezīme: entītija main () ir deklarēta arī globālajā tvērumā.

Bloka darbības joma

Paziņojums if, while, do, for vai switch var definēt bloku. Šāds apgalvojums ir salikts. Blokā deklarētā mainīgā nosaukumam ir bloka darbības joma. Tās darbības joma sākas tās deklarēšanas vietā un beidzas tās bloka beigās. Šī īsa programma parāda to mainīgajam ident:

#iekļaut
izmantojot vārda telpastundas;

intgalvenais()
{
ja (1==1)
{
/*daži apgalvojumi*/
intidentitāte= 5;
izmaksas<<identitāte<<' n';
/*daži apgalvojumi*/
}
atgriezties 0;
}

Mainīgais, piemēram, ident, kas ir deklarēts bloka tvērumā, ir lokāls mainīgais.

Mainīgo, kas deklarēts ārpus bloka darbības jomas un virs tā, var redzēt bloka galvenē (piemēram, nosacījums, lai bloķētu), kā arī bloka iekšpusē. Šī īsa programma parāda to mainīgajam, identificēt:

#iekļaut
izmantojot vārda telpastundas;

intgalvenais()
{
intidentificēt= 8;

ja (identificēt== 8)
{
izmaksas<<identificēt<<' n';
}
atgriezties 0;
}

Rezultāts ir 8. Šeit ir divas bloku darbības jomas: galvenās () funkcijas bloks un ligzdotais if-salikuma paziņojums. Ligzdotais bloks ir galvenā () funkciju bloka darbības joma.

Deklarāciju, kas ieviesta bloka tvērumā, nevar redzēt ārpus bloka. Šī īsā programma, kas netiek apkopota, ilustrē to ar mainīgo: mainīgais:

#iekļaut
izmantojot vārda telpastundas;

intgalvenais()
{
ja (1 == 1)
{
intmainīgais= piecpadsmit;
}
izmaksas<<mainīgais<<' n'; // kļūda: piekļūst ārpus tās darbības jomas.

atgriezties 0;
}

Kompilators rada kļūdas ziņojumu mainīgajam.

Ieviesta entītija, kas deklarēta saliktas funkcijas galvenē, nav redzama ārpus (zemāk) saliktā paziņojuma. Šis cilpas kods netiks apkopots, kā rezultātā tiks parādīts kļūdas ziņojums:

#iekļaut
izmantojot vārda telpastundas;

intgalvenais()
{
priekš (inti=0;i<4; ++i)
{
izmaksas<<i<<'';
}
izmaksas<<i<<'';

atgriezties 0;
}

Iterācijas mainīgais i ir redzams for-loop bloka iekšpusē, bet ne ārpus for-loop bloka.

Funkcijas darbības joma

Funkciju parametrs ir redzams funkciju blokā. Funkciju blokā deklarētā entītija ir redzama no deklarēšanas punkta līdz funkciju bloka beigām. To ilustrē šāda īsa programma:

#iekļaut
#iekļaut
izmantojot vārda telpastundas;

virkne fn(virkne str)
{
charstri[] = 'banāni';
/*citi apgalvojumi*/
virkne totalStr=lpp+stri;
atgrieztiestotalStr;
}

intgalvenais()
{
virkne totStr=fn('ēšana');
izmaksas<<totStr<<' n';

atgriezties 0;
}

Rezultāts ir šāds:
banānu ēšana

Piezīme. Entītiju, kas deklarēta ārpus funkcijas (virs tās), var redzēt funkciju parametru sarakstā un arī funkciju blokā.

Iezīme

Etiķetes darbības joma ir funkcija, kādā tā parādās. To ilustrē šāds kods:

#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn()
{
iet uzlabl;
/*citi apgalvojumi*/
labl: int= 2;
izmaksas<<<<' n';
}

intgalvenais()
{
fn();

atgriezties 0;
}

Izeja ir 2.

Uzskaitīšanas joma

Neskopēts uzskaitījums
Apsveriet šādu if-block:

ja (1==1)
{
enum {a, b, c=b+2};
izmaksas<<uz<<''<<b<<''<<c<<' n';
}

Rezultāts ir 0 1 3.

Pirmā bloka rinda ir uzskaitījums, a, b un c ir tās uzskaitītāji. Skaitītāja darbības joma sākas no deklarēšanas vietas līdz uzskaites norobežojošā bloka beigām.

Šis paziņojums netiks apkopots, jo c deklarēšanas punkts ir aiz a:

enum {uz=c+2, b, c};

Šis koda segments netiks apkopots, jo uzskaitītāji ir pieejami pēc uzskaites norobežojošā bloka:

ja (1==1)
{
enum {a, b, c=b+2};
}
izmaksas<<uz<<''<<b<<''<<c<<' n'; // kļūda: ārpus darbības jomas

Iepriekš minētais uzskaitījums ir aprakstīts kā neskopēts uzskaitījums, un tā uzskaitītāji ir aprakstīti kā neskopēti uzskaitītāji. Tas ir tāpēc, ka tas sākas tikai ar rezervēto vārdu-enum. Uzskaitījumi, kas sākas ar enum klasi vai enum structure, tiek aprakstīti kā tvēruma uzskaitījumi. To uzskaitītāji tiek aprakstīti kā skaitītāji, uz kuriem attiecas tvērums.

Darbības jomas uzskaitījums
Šāds paziņojums ir kārtībā:

enum klasevīrietis{a, b, c=b+2};

Šis ir tvēruma uzskaitījuma piemērs. Klases nosaukums ir nam. Šeit uzskaitītāja darbības joma sākas no deklarēšanas punkta līdz uzskaitījuma definīcijas beigām, nevis uzskaites norobežojošā bloka beigām. Šis kods netiks apkopots:

ja (1==1)
{
enum klasevīrietis{a, b, c=b+2};
izmaksas<<uz<<''<<b<<''<<c<<' n'; // kļūda: ārpus enum klases vai enum structure darbības jomas
}

Klases darbības joma

Ar normālu darbības jomu deklaratīvais reģions sākas no punkta, pēc tam turpinās un apstājas citā vietā. Darbības joma pastāv vienā nepārtrauktā reģionā. Izmantojot klasi, entītijas tvērums var būt dažādos reģionos, kas nav savienoti kopā. Noteikumi ligzdotiem blokiem joprojām ir spēkā. Šī programma to ilustrē:

#iekļaut
izmantojot vārda telpastundas;

// Bāzes klase
klaseCla
{
Privāts:
intmemP= 5;
aizsargāti:
intmemPro= 9;
publiski:
spēkā neesošsfn()
{
izmaksas<<memP<<' n';
}
};

// Atvasinātā klase
klaseDerCla: publiskiCla
{
publiski:
intderMem=memPro;
};
intgalvenais()
{
Cla obj;
obj.fn();
DerCla derObj;
izmaksas<<derObj.derMem<<' n';

atgriezties 0;
}

Rezultāts ir šāds:
5
9

Cla klasē mainīgais mainP ir redzams deklarēšanas vietā. Pēc tam īsā aizsargātā daļa tiek izlaista un pēc tam atkal redzama klases dalībnieku funkciju blokā. Atvasinātā klase tiek izlaista un pēc tam atkal redzama galvenajā () funkciju diapazonā (blokā).

Klasē Cla deklarācijas vietā ir redzams mainīgais memPro. Publiskās funkcijas fn () daļa tiek izlaista, pēc tam redzama atvasinātā klases apraksta blokā. Tas atkal redzams galvenajā () funkcijā.

Darbības jomas izšķirtspējas operators
Darbības jomas izšķirtspējas operators C ++ ir ::. To izmanto, lai piekļūtu statiskam klases dalībniekam. Šī programma to ilustrē:

#iekļaut
izmantojot vārda telpastundas;

klaseCla
{
publiski:
statisks int konstmeme= 5;
publiski:
statisks spēkā neesošsfn()
{
izmaksas<<meme<<' n';
}
};
intgalvenais()
{
izmaksas<<Cla::meme<<' n';
Cla::fn();

atgriezties 0;
}

Rezultāts ir šāds:
5
5

Statiskie elementi ir redzami galvenajā () funkciju blokā, kuriem var piekļūt, izmantojot darbības jomas izšķirtspējas operatoru.

Veidnes parametru darbības joma

Parastā veidnes parametra nosaukuma darbības joma sākas no deklarēšanas punkta līdz tā bloka beigām, kā norādīts šādā kodā:

veidne<tipa nosaukumsT,tipa nosaukumsU> struktūraVecums
{
T Jānis= vienpadsmit;
Tu Pēteris= 12.3;
T Marija= 13;
U Prieks= 14.6;
};

U un T ir redzami blokā.

Veidnes funkcijas prototipam darbības joma sākas no deklarēšanas punkta līdz funkciju parametru saraksta beigām, kā norādīts šajā paziņojumā:

veidne<tipa nosaukumsT,tipa nosaukumsU> spēkā neesošsfunkciju(Tu nē, tu ča,konst char *lpp);

Tomēr, runājot par klases aprakstu (definīciju), darbības joma var būt arī dažāda daļa, kā norādīts šajā kodā:

#iekļaut
izmantojot vārda telpastundas;

veidne<klaseT,klaseU> klaseTheCla
{
publiski:
t num;
statisksU ch;

spēkā neesošsfunkciju(Tu tēvs,konst char *lpp)
{
izmaksas << 'Tur ir ' <<uz vienu<< 'grāmatas vērts' <<<<lpp<< 'veikalā.' << ' n';
}
statisks spēkā neesošsjautri(U ch)
{
ja (ch== 'uz')
izmaksas << “Oficiālā statiskā dalībnieka funkcija” << ' n';
}
};

intgalvenais()
{
TheCla<int,char>obj;
obj.uz vienu = 12;
obj.funkciju('$','500');

atgriezties 0;
}

Vārds slēpjas

Nosaukuma slēpšanas piemērs rodas, ja ligzdotā blokā tiek atkārtoti deklarēts tā paša objekta tipa nosaukums. Šī programma to ilustrē:

#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn()
{
intkur= 3;
ja (1==1)
{
intkur= 4;
izmaksas<<kur<<' n';
}
izmaksas<<kur<<' n';
}

intgalvenais()
{
fn();
atgriezties 0;
}

Rezultāts ir šāds:
4
3

Tas ir tāpēc, ka ligzdotā bloka var slēpās var ārējā blokā.

Iespēja atkārtot deklarāciju tajā pašā jomā

Deklarācijas būtība ir vieta, kur nosaukums tiek ievadīts (pirmo reizi) tā darbības jomā.

Funkcijas prototips
Dažādas vienības, pat dažāda veida, parasti nevar deklarēt vienā darbības jomā. Tomēr funkcijas prototipu tajā pašā darbības jomā var deklarēt vairāk nekā vienu reizi. Šī programma ar diviem funkciju prototipiem un atbilstošu funkciju definīciju to ilustrē:

#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn(intuz vienu);
spēkā neesošsfn(intuz vienu);

spēkā neesošsfn(intuz vienu)
{
izmaksas<<uz vienu<<' n';
}

intgalvenais()
{
fn(5);

atgriezties 0;
}

Programma darbojas.

Pārslogotas funkcijas
Pārslogotas funkcijas ir funkcijas ar tādu pašu nosaukumu, bet atšķirīgi funkciju paraksti. Kā citu izņēmumu tajā pašā darbības jomā var definēt pārslogotas funkcijas ar tādu pašu nosaukumu. Šī programma to ilustrē:

#iekļaut
izmantojot vārda telpastundas;

spēkā neesošsfn(intuz vienu)
{
izmaksas<<uz vienu<<' n';
}

spēkā neesošsfn(peldēt)
{
izmaksas<<<<' n';
}

intgalvenais()
{
fn(5);
peldētflt= 8.7;
fn(flt);

atgriezties 0;
}

Rezultāts ir šāds:
5
8.7

Pārslogotās funkcijas ir definētas globālajā tvērumā.

Nosaukuma darbības joma

Nosaukuma darbības joma ir pelnījusi savu rakstu. Minētais raksts ir rakstīts šai vietnei linuxhint.com. Vienkārši ierakstiet meklēšanas vārdus Namespace Scope šīs vietnes (lapas) meklēšanas lodziņā un noklikšķiniet uz Labi, un jūs saņemsiet rakstu.

Darbības joma dažādās porcijās

Klase nav vienīgā shēma, kurā tvērums var būt dažādās daļās. Drauga norādītājs, daži izstrādātā tipa specifikatoru izmantošanas veidi un lietošanas direktīvas ir citas shēmas, kuru darbības joma atrodas dažādās vietās-sīkāku informāciju skatiet vēlāk.

Secinājums

Darbības joma ir deklaratīvs reģions. Deklarējošais reģions ir lielākā programmas teksta daļa, kurā ir derīgs entītijas nosaukums. To var sadalīt vairākās daļās saskaņā ar noteiktām programmēšanas shēmām, piemēram, ligzdotiem blokiem. Daļas, kurām nav deklarācijas punkta, veido potenciālo darbības jomu. Potenciālajai darbības jomai var būt deklarācija, bet var arī nebūt.