Abast en C ++

Scope C



Una entitat a C ++ té un nom que es pot declarar i / o definir. Una declaració és una definició, però una definició no és necessàriament una declaració. Una definició assigna memòria per a l'entitat designada, però una declaració pot assignar memòria per a l'entitat indicada o no. Una regió declarativa és la part més gran d'un programa en què el nom d'una entitat (variable) és vàlid. Aquesta regió s’anomena abast o abast potencial. Aquest article explica l'abast en C ++. A més, es necessiten coneixements bàsics en C ++ per entendre aquest article.

Contingut de l'article

Regió declarativa i abast

Una regió declarativa és la part més gran d'un text del programa en què el nom d'una entitat és vàlid. És la regió en què es pot utilitzar (veure) el nom no qualificat per referir-se a la mateixa entitat. Penseu en el programa breu següent:







#incloure
utilitzant espai de nomshores;

buitfn()
{
inton= 3;
si (1==1)
{
cost<<on<<' n';
}
}

intprincipal()
{
fn();
tornar 0;
}

La funció fn () té dos blocs: un bloc interior per a la condició if i un bloc exterior per al cos de la funció. L'identificador, var, s'introdueix i es veu al bloc exterior. També es veu al bloc interior, amb l’enunciat cout. Els blocs exterior i interior són l’abast del nom, var.



Tot i això, el nom, var, encara es pot utilitzar per declarar una entitat diferent, com ara un flotador al bloc interior. El següent codi ho il·lustra:



#incloure
utilitzant espai de nomshores;

buitfn()
{
inton= 3;
si (1==1)
{
flotaron= 7.5;
cost<<on<<' n';
}
}

intprincipal()
{
fn();
tornar 0;
}

La sortida és de 7,5. En aquest cas, el nom, var, ja no es pot utilitzar al bloc interior per referir-se al nombre enter del valor 3, que es va introduir (declarar) al bloc exterior. Aquests blocs interns es denominen abast potencial per a les entitats declarades al bloc exterior.





Nota: Una entitat del mateix tipus, com la del bloc exterior, encara es pot declarar al bloc interior. Tanmateix, en aquest cas, el que és vàlid al bloc interior és la nova declaració i el seu significat, mentre que la declaració antiga i el seu significat fora del bloc interior continuen sent vàlides al bloc exterior.

Una declaració del mateix nom en un bloc interior normalment anul·la la declaració del mateix nom fora d’aquest bloc interior. Els blocs interiors poden niar altres blocs interiors.



Abast global

Quan un programador només comença a escriure un fitxer, aquest és l'abast global. El programa breu següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

flotaron= 9.4;

intprincipal()
{
cost <<on<<' n';
cost <<::on<<' n';

tornar 0;
}

La sortida és:
9.4
9.4

En aquest cas, la regió o àmbit declaratiu per a var comença des del punt de declaració de var, continua cap avall fins al final del fitxer (unitat de traducció).

El bloc de la funció main () és un àmbit diferent; és un abast imbricat per a l'abast global. Per accedir a una entitat de l'abast global, des d'un àmbit diferent, l'identificador s'utilitza directament o l'operador de resolució d'abast l'ha precedit ::.

Nota: L'entitat, main (), també es declara a l'abast global.

Abast del bloc

La sentència if, while, do, for o switch pot definir cadascun un bloc. Aquesta afirmació és una afirmació composta. El nom d’una variable declarada en un bloc té l’abast d’un bloc. El seu abast comença al punt de declaració i acaba al final del bloc. El següent programa breu il·lustra això per a la variable, ident:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
si (1==1)
{
/ * algunes afirmacions * /
intident= 5;
cost<<ident<<' n';
/ * algunes afirmacions * /
}
tornar 0;
}

Una variable, com ara ident, declarada a l'abast del bloc és una variable local.

Una variable declarada fora de l’abast del bloc i superior a ella es pot veure a la capçalera del bloc (per exemple, condició del bloc if) i també dins del bloc. El següent programa breu il·lustra això per a la variable, identif:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
intidentificador= 8;

si (identificador== 8)
{
cost<<identificador<<' n';
}
tornar 0;
}

La sortida és 8. Hi ha dos àmbits de blocs aquí: el bloc per a la funció main () i la sentència if-compound imbricada. El bloc niat és l’abast potencial del bloc de funció main ().

Una declaració introduïda en un abast de bloc no es pot veure fora del bloc. El següent programa curt, que no es compila, il·lustra això amb la variable, variab:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
si (1 == 1)
{
intvariab= 15;
}
cost<<variab<<' n'; // error: s'ha accedit fora del seu àmbit.

tornar 0;
}

El compilador produeix un missatge d'error per a variab.

Una entitat introduïda, declarada a la capçalera d'una funció composta, no es pot veure fora (a sota) de la sentència composta. El següent codi de bucle no es compilarà, donant lloc a un missatge d'error:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
per (intjo=0;jo<4; ++jo)
{
cost<<jo<<'';
}
cost<<jo<<'';

tornar 0;
}

La variable d'iteració, i, es veu dins del bloc for-loop però no fora del bloc for-loop.

Abast de la funció

Es veu un paràmetre de funció al bloc de funcions. Una entitat declarada en un bloc de funcions es veu des del punt de declaració fins al final del bloc de funcions. El programa breu següent ho il·lustra:

#incloure
#incloure
utilitzant espai de nomshores;

cadena fn(corda str)
{
charstri[] = 'plàtans';
/ * altres afirmacions * /
string totalStr=pàg+stri;
tornartotalStr;
}

intprincipal()
{
string totStr=fn('menjar');
cost<<totStr<<' n';

tornar 0;
}

La sortida és:
menjar plàtans

Nota: Una entitat declarada fora de la funció (a sobre) es pot veure a la llista de paràmetres de funció i també al bloc de funcions.

Etiqueta

L’abast d’una etiqueta és la funció en què apareix. El següent codi ho il·lustra:

#incloure
utilitzant espai de nomshores;

buitfn()
{
anar alabl;
/ * altres afirmacions * /
labl: intno= 2;
cost<<no<<' n';
}

intprincipal()
{
fn();

tornar 0;
}

La sortida és 2.

Abast de l’enumeració

Enumeració sense abast
Penseu en el següent bloc si:

si (1==1)
{
enum {a, b, c=b+2};
cost<<a<<''<<b<<''<<c<<' n';
}

La sortida és 0 1 3.

La primera línia del bloc és una enumeració, a, b i c són els seus enumeradors. L'abast d'un enumerador comença des del punt de declaració fins al final del bloc adjunt de l'enumeració.

La declaració següent no es compilarà perquè el punt de declaració de c és posterior al de a:

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

El següent segment de codi no es compilarà perquè s'accedeix als enumeradors després del bloc adjunt de l'enumeració:

si (1==1)
{
enum {a, b, c=b+2};
}
cost<<a<<''<<b<<''<<c<<' n'; // error: fora de l'abast

L'enumeració anterior es descriu com una enumeració sense àmbit, i els seus enumeradors es descriuen com a enumeradors sense àmbit. Això es deu al fet que només comença amb la paraula reservada, enum. Les enumeracions que comencen amb classe enum o enum struct es descriuen com a enumeracions d’àmbit. Els seus enumeradors es descriuen com a enumeradors d’àmbit.

Enumeració d'abast
La següent afirmació està bé:

enum classemasculí{a, b, c=b+2};

Aquest és un exemple d'una enumeració d'abast. El nom de la classe és nam. Aquí, l'abast de l'enumerador comença des del punt de declaració fins al final de la definició d'enumeració i no fins al final del bloc adjunt per a l'enumeració. No es compilarà el codi següent:

si (1==1)
{
enum classemasculí{a, b, c=b+2};
cost<<a<<''<<b<<''<<c<<' n'; // error: fora de l'abast de la classe enum o enum struct
}

Abast de la classe

Amb l’abast normal, la regió declarativa comença des d’un punt, després continua i s’atura en un punt diferent. L'abast existeix en una regió contínua. Amb la classe, l'abast d'una entitat pot estar en diferents regions que no estan units. Les regles per als blocs imbricats encara s’apliquen. El programa següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

// Classe base
classeCla
{
privat:
intmemP= 5;
protegit:
intmemPro= 9;
públic:
buitfn()
{
cost<<memP<<' n';
}
};

// Classe derivada
classeDerCla: públicCla
{
públic:
intderMem=memPro;
};
intprincipal()
{
Cla obj;
obj.fn();
DerCla derObj;
cost<<derObj.derMem<<' n';

tornar 0;
}

La sortida és:
5
9

A la classe Cla, la variable memP, es veu al punt de declaració. Després, se salta la porció curta de protecció i es torna a veure al bloc de funció del membre de la classe. La classe derivada s'omet i es torna a veure a l'abast de la funció main () (bloc).

A la classe Cla, la variable memPro, es veu al punt de declaració. La part de la funció pública fn () s'omet i es veu al bloc de descripció de classe derivada. Es torna a veure a la funció principal ().

Operador de resolució d'abast
L'operador de resolució d'abast en C ++ és ::. S'utilitza per accedir a un membre estàtic de la classe. El programa següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

classeCla
{
públic:
estàtic int constmeme= 5;
públic:
estàtic buitfn()
{
cost<<meme<<' n';
}
};
intprincipal()
{
cost<<Cla::meme<<' n';
Cla::fn();

tornar 0;
}

La sortida és:
5
5

Els membres estàtics es veuen al bloc de funció main (), al qual s’accedeix mitjançant l’operador de resolució d’àmbit.

Abast del paràmetre de la plantilla

L'abast normal d'un nom de paràmetre de plantilla comença des del punt de declaració fins al final del seu bloc, com al codi següent:

plantilla<typenameT,typenameU> estructEdats
{
T John= 11;
Tu Peter= 12.3;
T Maria= 13;
U Alegria= 14.6;
};

U i T es veuen dins del bloc.

Per a un prototip de funció de plantilla, l'abast comença des del punt de declaració fins al final de la llista de paràmetres de la funció, tal com es fa a la sentència següent:

plantilla<typenameT,typenameU> buitfunció(T no, O txa,const char *pàg);

Tanmateix, quan es tracta de la descripció (definició) de la classe, l’abast també pot ser de diferents parts, com en el codi següent:

#incloure
utilitzant espai de nomshores;

plantilla<classeT,classeU> classeTheCla
{
públic:
núm;
estàticU ch;

buitfunció(U pare,const char *pàg)
{
cost << 'Hi ha' <<en un<< 'val la pena els llibres' <<no<<pàg<< 'a la botiga'. << ' n';
}
estàtic buitdiversió(U ch)
{
si (cap== 'A')
cost << 'Funció de membre estàtic oficial' << ' n';
}
};

intprincipal()
{
TheCla<int,char>obj;
obj.en un = 12;
obj.funció('$','500');

tornar 0;
}

Amaga el nom

Un exemple d’ocultació de noms es produeix quan es torna a declarar el nom del mateix tipus d’objecte en un bloc niat. El programa següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

buitfn()
{
inton= 3;
si (1==1)
{
inton= 4;
cost<<on<<' n';
}
cost<<on<<' n';
}

intprincipal()
{
fn();
tornar 0;
}

La sortida és:
4
3

Es deu a que var al bloc niat va amagar var al bloc exterior.

Possibilitat de repetir la declaració en el mateix àmbit

El punt de la declaració és on s’introdueix el nom (per primera vegada) al seu abast.

Prototip de funció
Normalment no es poden declarar diferents entitats, fins i tot de diferents tipus, en el mateix àmbit. No obstant això, un prototip de funció es pot declarar més d'una vegada en el mateix àmbit. El següent programa amb dos prototips de funció i la definició de funció corresponent ho il·lustra:

#incloure
utilitzant espai de nomshores;

buitfn(inten un);
buitfn(inten un);

buitfn(inten un)
{
cost<<en un<<' n';
}

intprincipal()
{
fn(5);

tornar 0;
}

El programa funciona.

Funcions sobrecarregades
Les funcions sobrecarregades són funcions amb el mateix nom però signatures de funcions diferents. Com a altra excepció, les funcions sobrecarregades amb el mateix nom es poden definir en el mateix àmbit. El programa següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

buitfn(inten un)
{
cost<<en un<<' n';
}

buitfn(flotarno)
{
cost<<no<<' n';
}

intprincipal()
{
fn(5);
flotarflt= 8.7;
fn(flt);

tornar 0;
}

La sortida és:
5
8.7

Les funcions sobrecarregades s'han definit a l'abast global.

Àmbit de l'espai de noms

Àmbit d’espai de noms es mereix el seu propi article. L’esmentat article s’ha escrit per a aquest lloc web, linuxhint.com. Només cal que escriviu les paraules de cerca Àmbit d’espai de noms al quadre de cerca d’aquest lloc (pàgina) i feu clic a D'acord, i obtindreu l'article.

Abast en diferents porcions

La classe no és l'únic esquema en què l'abast pot estar en diferents parts. Especificador d'amics, certs usos de l'especificador de tipus elaborat i directives d'ús són altres esquemes on l'abast es troba en llocs diferents; per obtenir més informació, vegeu més endavant.

Conclusió

Un abast és una regió declarativa. Una regió declarativa és la part més gran d'un text del programa en què el nom d'una entitat és vàlid. Es pot dividir en més d'una porció d'acord amb certs esquemes de programació, com ara blocs imbricats. Les porcions que no tenen el punt de declaració constitueixen l'abast potencial. L'abast potencial pot tenir o no la declaració.