Soveltamisala C ++: ssa

Scope C



C ++: n entiteetillä on nimi, joka voidaan julistaa ja/tai määrittää. Ilmoitus on määritelmä, mutta määritelmä ei välttämättä ole julistus. Määritelmä varaa muistin nimetylle entiteetille, mutta ilmoitus voi tai ei voi varata muistia nimetylle entiteetille. Ilmoittava alue on suurin osa ohjelmaa, jossa entiteetin (muuttujan) nimi on voimassa. Tätä aluetta kutsutaan laajuudeksi tai potentiaaliseksi laajuudeksi. Tämä artikkeli selittää C ++: n kattavuuden. Lisäksi tämän artikkelin ymmärtämiseen tarvitaan C ++: n perustiedot.

Artikkelin sisältö

Ilmoittava alue ja soveltamisala

Ilmoittava alue on suurin osa ohjelman tekstiä, jossa entiteetin nimi on voimassa. Se on alue, jolla ehdotonta nimeä voidaan käyttää (nähdä) viittaamaan samaan kokonaisuuteen. Harkitse seuraavaa lyhyttä ohjelmaa:







#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn()
{
intmissä= 3;
jos (1==1)
{
kustannus<<missä<<'' n'';
}
}

inttärkein()
{
fn();
palata 0;
}

Funktiossa fn () on kaksi lohkoa: sisäinen lohko if-ehdolle ja ulkoinen lohko funktion rungolle. Tunniste, var, lisätään ja nähdään ulkoisessa lohkossa. Se näkyy myös sisälohkossa cout -lausunnon kanssa. Ulompi ja sisempi lohko ovat molemmat nimen laajuus, var.



Nimeä var, voidaan kuitenkin edelleen käyttää eri kokonaisuuden, kuten kellukkeen ilmoittamiseen sisäisessä lohkossa. Seuraava koodi havainnollistaa tätä:



#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn()
{
intmissä= 3;
jos (1==1)
{
kelluamissä= 7.5;
kustannus<<missä<<'' n'';
}
}

inttärkein()
{
fn();
palata 0;
}

Lähtö on 7.5. Tässä tapauksessa nimeä var ei voi enää käyttää sisäisessä lohkossa viittaamaan kokonaislukuun arvo 3, joka lisättiin (julistettiin) ulkoiseen lohkoon. Tällaisia ​​sisäisiä lohkoja kutsutaan mahdollisiksi ulottuvuuksiksi ulkoisessa lohkossa ilmoitetuille yksiköille.





Huomautus: Samantyyppinen entiteetti, kuten ulkoisen lohkon, voidaan silti ilmoittaa sisäisessä lohkossa. Kuitenkin tässä tapauksessa sisälauseessa on voimassa uusi ilmoitus ja sen merkitys, kun taas vanha ilmoitus ja sen merkitys sisäisen lohkon ulkopuolella pysyvät voimassa ulkoisessa lohkossa.

Saman nimen ilmoitus sisäisessä lohkossa yleensä ohittaa saman nimen julistuksen sisäisen lohkon ulkopuolella. Sisäiset lohkot voivat sisäistää muita sisäosia.



Maailmanlaajuinen soveltamisala

Kun ohjelmoija juuri alkaa kirjoittaa tiedostoa, se on maailmanlaajuinen laajuus. Seuraava lyhyt ohjelma havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

kelluamissä= 9.4;

inttärkein()
{
kustannus <<missä<<'' n'';
kustannus <<::missä<<'' n'';

palata 0;
}

Lähtö on:
9.4
9.4

Tässä tapauksessa deklaratiivinen alue tai var -alue alkaa var -ilmoituksen kohdasta, jatkuu alaspäin tiedoston loppuun (käännösyksikkö).

Päätoiminnon () lohko on erilainen; se on sisäkkäinen laajuus maailmanlaajuiselle laajuudelle. Päästäkseen globaalin laajuuden entiteettiin eri laajuudesta tunnistetta käytetään suoraan tai sitä edeltää laajuudenratkaisuoperaattori ::.

Huomautus: Entiteetti, main (), on myös ilmoitettu maailmanlaajuisessa laajuudessa.

Estä soveltamisala

Jos, kun, tee, tee tai vaihda -lauseke voi kukin määrittää lohkon. Tällainen lausunto on yhdistelmä. Lohkossa ilmoitetun muuttujan nimellä on lohkon laajuus. Sen soveltamisala alkaa sen ilmoituskohdasta ja päättyy sen lohkon loppuun. Seuraava lyhyt ohjelma havainnollistaa tätä muuttujaa, ident:

#sisältää
käyttämällä nimiavaruustuntia;

inttärkein()
{
jos (1==1)
{
/*joitain väitteitä*/
intident= 5;
kustannus<<ident<<'' n'';
/*joitain väitteitä*/
}
palata 0;
}

Lohkon laajuudessa ilmoitettu muuttuja, kuten ident, on paikallinen muuttuja.

Lohkon laajuuden ulkopuolella ja sen yläpuolella ilmoitettu muuttuja näkyy lohkon otsikossa (esim. Ehto jos-lohko) ja myös lohkon sisällä. Seuraava lyhyt ohjelma havainnollistaa tätä muuttujaa, tunniste:

#sisältää
käyttämällä nimiavaruustuntia;

inttärkein()
{
inttunnista= 8;

jos (tunnista== 8)
{
kustannus<<tunnista<<'' n'';
}
palata 0;
}

Tulos on 8. Tässä on kaksi lohkon laajuutta: main () -funktion lohko ja sisäkkäinen if-yhdiste-lause. Sisäkkäinen lohko on päätoimintolohkon () mahdollinen laajuus.

Lohkon soveltamisalaan lisätty ilmoitus ei näy lohkon ulkopuolella. Seuraava lyhyt ohjelma, jota ei käännetä, havainnollistaa tätä muuttujalla muuttuja:

#sisältää
käyttämällä nimiavaruustuntia;

inttärkein()
{
jos (1 == 1)
{
intmuuttuja= viisitoista;
}
kustannus<<muuttuja<<'' n''; // virhe: käytetty sen soveltamisalan ulkopuolella.

palata 0;
}

Kääntäjä antaa muuttujalle virheilmoituksen.

Yhdistelmäfunktion otsikossa ilmoitettu kokonaisuus ei näy yhdistelmälausekkeen ulkopuolella (alla). Seuraavaa for-loop-koodia ei käännetä, mikä johtaa virheilmoitukseen:

#sisältää
käyttämällä nimiavaruustuntia;

inttärkein()
{
varten (inti=0;i<4; ++i)
{
kustannus<<i<<'';
}
kustannus<<i<<'';

palata 0;
}

Iteraatiomuuttuja i näkyy for-loop-lohkon sisällä, mutta ei for-loop-lohkon ulkopuolella.

Toimintoalue

Toimintolohkossa näkyy toimintoparametri. Toimintolohkossa ilmoitettu entiteetti nähdään ilmoituspisteestä toimintolohkon loppuun. Seuraava lyhyt ohjelma havainnollistaa tätä:

#sisältää
#sisältää
käyttämällä nimiavaruustuntia;

merkkijono fn(merkkijono str)
{
hiiltyästri[] = 'banaanit';
/*muita lausuntoja*/
merkkijono totalStr=s+stri;
palatatotalStr;
}

inttärkein()
{
merkkijono totStr=fn('syöminen');
kustannus<<totStr<<'' n'';

palata 0;
}

Lähtö on:
banaanien syöminen

Huomaa: Toiminnon ulkopuolella (sen yläpuolella) ilmoitettu entiteetti näkyy toimintoparametriluettelossa ja myös toimintolohkossa.

Etiketti

Tarran laajuus on toiminto, jossa se esiintyy. Seuraava koodi havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn()
{
meneLabl;
/*muita lausuntoja*/
Labl: intei= 2;
kustannus<<ei<<'' n'';
}

inttärkein()
{
fn();

palata 0;
}

Lähtö on 2.

Luettelon laajuus

Tarkentamaton luettelo
Harkitse seuraavaa if-blockia:

jos (1==1)
{
enum {a, b, c=b+2};
kustannus<<kohteeseen<<''<<b<<''<<c<<'' n'';
}

Lähtö on 0 1 3.

Lohkon ensimmäinen rivi on luettelo, a, b ja c ovat sen laskijat. Luetteloijan laajuus alkaa ilmoituskohdasta luettelon liitettävän lohkon loppuun.

Seuraavaa lausetta ei koota, koska c: n ilmoituspiste on a: n jälkeen:

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

Seuraavaa koodisegmenttiä ei käännetä, koska luetteloijia käytetään luettelon sulkevan lohkon jälkeen:

jos (1==1)
{
enum {a, b, c=b+2};
}
kustannus<<kohteeseen<<''<<b<<''<<c<<'' n''; // virhe: soveltamisalan ulkopuolella

Yllä olevaa luetteloa kuvataan skannaamattomana luettelona, ​​ja sen luetteloijat kuvataan skannaamattomana. Tämä johtuu siitä, että se alkaa vain varatulla sanalla, enum. Luettelot, jotka alkavat enum -luokalla tai enum -rakenteella, kuvataan laajuusluetteloina. Niiden laskureita kuvataan laajuuslaskureiksi.

Laajuusluettelo
Seuraava lausunto on OK:

enum luokkaUros{a, b, c=b+2};

Tämä on esimerkki laajuudesta. Luokan nimi on nam. Tässä luetteloijan soveltamisala alkaa ilmoituskohdasta luettelointimääritelmän loppuun eikä luettelon sulkevan lohkon loppuun. Seuraavaa koodia ei käännetä:

jos (1==1)
{
enum luokkaUros{a, b, c=b+2};
kustannus<<kohteeseen<<''<<b<<''<<c<<'' n''; // virhe: enum -luokan tai enum -rakenteen ulottuvilta
}

Luokan laajuus

Normaalilla mittakaavalla deklaratiivinen alue alkaa pisteestä, jatkuu ja pysähtyy toiseen kohtaan. Soveltamisala on yhdellä jatkuvalla alueella. Luokan avulla kokonaisuuden laajuus voi olla eri alueilla, joita ei ole liitetty yhteen. Sisäkkäisiä lohkoja koskevat säännöt ovat edelleen voimassa. Seuraava ohjelma havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

// Perusluokka
luokkaCla
{
yksityinen:
intmuisti= 5;
suojattu:
intmemPro= 9;
julkinen:
mitätönfn()
{
kustannus<<muisti<<'' n'';
}
};

// Johdettu luokka
luokkaDerCla: julkinenCla
{
julkinen:
intderMem=memPro;
};
inttärkein()
{
Cla obj;
obj.fn();
DerCla derObj;
kustannus<<derObj.derMem<<'' n'';

palata 0;
}

Lähtö on:
5
9

Luokassa Cla muuttuja memP näkyy ilmoituskohdassa. Sen jälkeen suojatun lyhyt osa ohitetaan ja nähdään sitten uudelleen luokan jäsentoimintolohkossa. Johdettu luokka ohitetaan ja nähdään sitten uudelleen päätoimintoalueella ().

Luokassa Cla muuttuja memPro näkyy ilmoituskohdassa. Julkisen funktion osa fn () ohitetaan ja nähdään sitten johdetussa luokankuvauslohkossa. Se näkyy jälleen alas päätoiminnossa ().

Scope Resolution Operaattori
Skaalatarkkuusoperaattori C ++: ssa on ::. Sitä käytetään pääsemään luokan staattiseen jäseneen. Seuraava ohjelma havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

luokkaCla
{
julkinen:
staattinen int constmeemi= 5;
julkinen:
staattinen mitätönfn()
{
kustannus<<meemi<<'' n'';
}
};
inttärkein()
{
kustannus<<Cla::meemi<<'' n'';
Cla::fn();

palata 0;
}

Lähtö on:
5
5

Staattiset jäsenet näkyvät päätoiminto () -toimintolohkossa, jota käytetään laajuuden tarkkuuden operaattorilla.

Malliparametrin laajuus

Malliparametrin nimen normaali laajuus alkaa ilmoituskohdasta sen lohkon loppuun, kuten seuraavassa koodissa:

sapluuna<typenameT,typenameU> rakenneIät
{
T John= yksitoista;
Sinä Peter= 12.3;
T Mary= 13;
U Joy= 14.6;
};

U ja T näkyvät lohkon sisällä.

Mallifunktion prototyypin laajuus alkaa ilmoituskohdasta funktion parametriluettelon loppuun, kuten seuraavassa lauseessa:

sapluuna<typenameT,typenameU> mitätöntoiminto(Et, sinä cha,const hiiltyä *s);

Luokan kuvauksen (määritelmän) osalta soveltamisala voi kuitenkin olla myös eri osainen, kuten seuraavassa koodissa:

#sisältää
käyttämällä nimiavaruustuntia;

sapluuna<luokkaT,luokkaU> luokkaTheCla
{
julkinen:
t numero;
staattinenU ch;

mitätöntoiminto(Sinä isä,const hiiltyä *s)
{
kustannus << 'Siellä on ' <<yhdellä<< 'arvokkaita kirjoja' <<ei<<s<< ' kaupassa.' << '' n'';
}
staattinen mitätönhauskaa(U ch)
{
jos (ch== '')
kustannus << '' Virallinen staattinen jäsentoiminto '' << '' n'';
}
};

inttärkein()
{
TheCla<int,hiiltyä>obj;
obj.yhdellä = 12;
obj.toiminto($,'500');

palata 0;
}

Nimi piilossa

Esimerkki nimen piilottamisesta tapahtuu, kun saman objektityypin nimi julistetaan uudelleen sisäkkäisessä lohkossa. Seuraava ohjelma havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn()
{
intmissä= 3;
jos (1==1)
{
intmissä= 4;
kustannus<<missä<<'' n'';
}
kustannus<<missä<<'' n'';
}

inttärkein()
{
fn();
palata 0;
}

Lähtö on:
4
3

Tämä johtuu siitä, että sisäkkäisen lohkon var piilotti varin ulkoisessa lohkossa.

Mahdollisuus toistaa ilmoitus samassa laajuudessa

Ilmoituksen tarkoitus on se, missä nimi esitetään (ensimmäistä kertaa) sen soveltamisalassa.

Toiminnon prototyyppi
Eri yhteisöjä, jopa erityyppisiä, ei yleensä voida ilmoittaa samaan soveltamisalaan. Toiminnon prototyyppi voidaan kuitenkin julistaa useammin kuin kerran samassa laajuudessa. Seuraava ohjelma, jossa on kaksi funktion prototyyppiä ja vastaava funktion määritelmä, havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn(intyhdellä);
mitätönfn(intyhdellä);

mitätönfn(intyhdellä)
{
kustannus<<yhdellä<<'' n'';
}

inttärkein()
{
fn(5);

palata 0;
}

Ohjelma toimii.

Ylikuormitetut toiminnot
Ylikuormitetut toiminnot ovat toimintoja, joilla on sama nimi, mutta eri toimintojen allekirjoitukset. Toisena poikkeuksena voidaan nimetä ylikuormitetut toiminnot samalla nimellä. Seuraava ohjelma havainnollistaa tätä:

#sisältää
käyttämällä nimiavaruustuntia;

mitätönfn(intyhdellä)
{
kustannus<<yhdellä<<'' n'';
}

mitätönfn(kelluaei)
{
kustannus<<ei<<'' n'';
}

inttärkein()
{
fn(5);
kelluaflt= 8.7;
fn(flt);

palata 0;
}

Lähtö on:
5
8.7

Ylikuormitetut toiminnot on määritelty maailmanlaajuisesti.

Nimiavaruuden laajuus

Namespace Scope ansaitsee oman artikkelinsa. Mainittu artikkeli on kirjoitettu tälle verkkosivustolle, linuxhint.com. Kirjoita vain hakusanat Namespace Scope tämän sivuston (sivun) hakukenttään ja napsauta OK, niin saat artikkelin.

Soveltamisala eri annoksina

Luokka ei ole ainoa järjestelmä, jossa laajuus voi olla eri osissa. Ystävämäärittäjä, tietyt kehitetyn tyyppimääritteen käyttötavat ja käyttöohjeet ovat muita järjestelmiä, joissa soveltamisala on eri paikoissa-katso lisätietoja myöhemmin.

Johtopäätös

Soveltamisala on deklaratiivinen alue. Ilmoittava alue on suurin osa ohjelman tekstiä, jossa entiteetin nimi on voimassa. Se voidaan jakaa useampaan osaan tiettyjen ohjelmointimenetelmien, kuten sisäkkäisten lohkojen, mukaisesti. Osat, joilla ei ole ilmoituspistettä, muodostavat mahdollisen soveltamisalan. Mahdollisella soveltamisalalla voi olla tai ei ole ilmoitusta.