Especificadors d'accés C ++

C Access Specifiers



A C ++, una classe és un conjunt de variables i funcions que s’han configurat per treballar conjuntament. Quan es donen valors a les variables de la classe, s’obté un objecte. Un objecte té les mateixes variables i funcions que una classe, però aquesta vegada, les variables tenen valors. Es poden crear molts objectes a partir d’una classe. Un objecte difereix d’un altre objecte segons el conjunt de valors assignat a les variables de l’altre objecte. Es diu que la creació d’un objecte a partir d’una classe és la instància de l’objecte. Fins i tot si dos objectes diferents tenen els mateixos valors per a les seves variables, aquests objectes són entitats diferents, identificades amb noms diferents al programa. Les variables d'un objecte i la seva classe corresponent s'anomenen membres de dades. Les funcions d’un objecte i la seva classe corresponent s’anomenen funcions membres. Els membres de dades i les funcions dels membres s’anomenen membres.

La paraula accés significa llegir o canviar el valor d’una variable i també significa utilitzar una funció. Els especificadors d'accés C ++ són les paraules, privat, protegit i públic. Decideixen si un membre pot accedir a altres membres de la seva classe o si una funció o un operador que no pertany a la classe pot accedir a cap membre de la classe. També decideixen si un membre d’una classe derivada (fill) pot accedir a un membre d’una classe pare.







Es requereixen coneixements bàsics de C ++ per entendre aquest article i provar el codi proporcionat.



Contingut de l'article

Els especificadors públics i privats

Classe
Qualsevol membre d'una classe pot accedir a qualsevol altre membre d'aquesta mateixa classe, independentment del qual estigui etiquetat com a públic o privat. Penseu en el programa següent:



#incloure
utilitzant espai de nomshores;

classeTheCla
{
privat:
intnum1;
intnum2;
públic:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intmètode()
{
tornarnum1;
}
};

intprincipal()
{
TheCla obj(10,20);
intno2=obj.mètode();
cost<<no2<<' n';

//int no1 = obj.num1;

tornar 0;
}

La sortida és 10. Els membres privats són num1 i num2. Els membres públics són TheCla () i method (). Tingueu en compte que TheCla () és la funció constructora que inicialitza variables d’interès. La regió d'un especificador d'accés comença des de la seva etiqueta fins al final de la descripció de classe (definició) o fins a l'inici d'un altre especificador d'accés.





A la funció main (), la primera sentència és la instanciació que implica la funció constructora, que inicialitza num1 i num2. La següent declaració crida al membre públic, method (), de la classe.

Ara, a la descripció de classe (definició), la funció de membre públic, TheCla (), accedeix als membres privats, num1 i num2. A més, la funció de membre públic, method (), accedeix al membre privat, num1. Qualsevol membre d'una descripció de classe pot accedir a qualsevol altre membre de la mateixa descripció de classe; no importa quin membre sigui privat o públic.



Tot i això, una funció o un operador no declarat a la descripció de la classe i fora de la descripció de la classe només pot accedir als membres públics de la classe. La funció main (), per exemple, és una funció declarada fora de la descripció de la classe. Només ha pogut accedir al mètode () i als membres públics de TheCla (). Dins de la funció main (), la funció TheCla () és obj (10, 20).

Una funció externa o un operador extern, com ara la funció main (), no pot accedir a cap dels membres privats de la classe, com ara num1 o num2. Elimineu l'indicador de comentaris, //, de l'últim enunciat de main (). Si intenteu compilar el programa, tingueu en compte que el programa no es compilarà, donant un missatge d'error.

Especificador per defecte
L'especificador per defecte per a una classe és privat. Per tant, la descripció de la classe anterior és la mateixa que la següent, privada, però sense l’especificador:

classeTheCla
{
intnum1;
intnum2;
públic:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intmètode()
{
tornarnum1;
}
};

Nota : l’etiqueta de l’especificador d’accés comença per l’especificador i, seguidament, va seguida de dos punts.

L'especificador protegit

Dins d’una descripció de classe i des d’una funció externa o un operador extern, l’especificador protegit és el mateix que l’especificador privat. Ara, substituïu l’especificador privat del programa anterior per l’especificador, protegiu i elimineu l’indicador de comentaris, //, de la sentència de l’últim de la funció main (). Si intenteu compilar el programa, tingueu en compte que el programa no es compilarà, donant un missatge d'error.

El problema de l’especificador protegit apareix quan els membres de la classe derivada (heretada) han d’accedir als membres de la classe base (pare).

Classe derivada del públic amb membres públics
Penseu en el programa següent:

#incloure
utilitzant espai de nomshores;

classeTheCla
{
públic:
intnum1= 10;
protegit:
intnum2= 20;
privat:
intnum3= 30;
};

classeChildCla: públicTheCla
{
públic:
intmètode1()
{
tornarnum1;
}
intmètode2()
{
tornarnum2;
}
/ * int mètode3 ()
{
retorn num3;
} * /

};

intprincipal()
{
ChildCla childObj;
intno1=nenObj.mètode1();
cost<<no1<<' n';

intno2=nenObj.mètode2();
cost<<no2<<' n';

tornar 0;
}

La sortida és:
10
20

A la classe base, num1 és públic, num2 està protegit i num3 és privat. A la classe derivada, totes les funcions membres són públiques. La primera funció, mètode1 (), accedeix al membre de dades públiques, num1. La segona funció, method2 (), accedeix al membre de dades protegit, num2. La tercera funció, mètode3 (), encara que actualment comentada, hauria d’accedir al membre de dades privades, num3.

Una classe derivada no es declara sense un especificador d'accés (públic, protegit o privat). A la part superior, es declara la classe derivada amb l’especificador públic, és a dir:

classeChildCla: públicTheCla{}

Ara no comenteu la definició de la funció del tercer membre de la classe derivada. Si intenteu compilar el programa, tingueu en compte que no es compilarà, donant un missatge d'error.

Nota : Quan tota la classe derivada es declara pública, els seus membres no poden accedir als membres privats de la classe base. Tanmateix, els seus membres poden accedir als membres públics i protegits de la classe base. El programa anterior ho il·lustra.

Tanmateix, tingueu en compte que un membre públic de la classe derivada pública pot accedir a un membre protegit de la classe base.

Especificadors de classes derivats i especificadors de membres

Classe derivada protegida amb membres públics
Substituïu l'especificador públic per protegit a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: protegitTheCla{}

Compileu i executeu el programa i tingueu en compte que el resultat és el mateix que abans.

Per tant, quan es declara protegida tota la classe derivada, els seus membres no poden accedir als membres privats de la classe base. Tanmateix, els seus membres poden accedir als membres públics i protegits de la classe base. Això és el mateix que quan es declara pública la classe derivada.

Nota : un membre protegit de la classe derivada pública pot accedir a un membre protegit de la classe base.

Classe privada derivada amb membres públics
Substituïu l'especificador protegit per privat a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: privatTheCla{}

Compileu i executeu el programa i tingueu en compte que el resultat és el mateix que abans.

Per tant, quan tota la classe derivada es declara privada, els seus membres no poden accedir als membres privats de la classe base. Tanmateix, els seus membres poden accedir als membres públics i protegits de la classe base. Això és el mateix que quan la classe derivada es declara protegida o pública.

Classe derivada pública amb membres protegits
Escriviu, compileu i executeu el programa següent, en què es protegeix tota la classe derivada i també es protegeixen els seus membres. Alguns segments de codi són els següents:

#incloure
utilitzant espai de nomshores;

classeTheCla
{
públic:
intnum1= 10;
protegit:
intnum2= 20;
privat:
intnum3= 30;
};

classeChildCla: públicTheCla
{
protegit:
intmètode1()
{
tornarnum1;
}
intmètode2()
{
tornarnum2;
}
/ * int mètode3 ()
{
retorn num3;
} * /

};

intprincipal()
{
/ * ChildCla childObj;
int no1 = childObj.method1 ();
cost<
/ * int no2 = childObj.method2 ();
cost<
tornar 0;
}

El programa funciona tal com és. No hi ha cap sortida, i no se suposa que hi ha cap sortida, en funció de com s'hagi escrit el programa.

Ara, no comenteu la definició de la funció, mètode3 (), a la classe derivada. Si intenteu compilar el programa, tingueu en compte que no es compilarà, donant un missatge d'error. Això significa que no es pot accedir a un membre privat des d'una funció externa, un operador extern o una classe derivada. Aquesta és la mateixa conclusió que es va concloure anteriorment, relativa a l'accés a un membre privat.

Nota : un membre protegit de la classe derivada protegida pot accedir a un membre protegit de la classe base.

Ara, torneu a posar els comentaris a la classe derivada i anuleu el comentari del primer segment de codi a la funció main (). Si intenteu compilar el programa, tingueu en compte que el programa no es compilarà a causa del primer segment de codi de la funció main (). Aquest efecte no és nou. A part de la classe derivada, funcions externes i operadors externs, els membres protegits i privats d’una classe (base o derivada) són del mateix especificador, privats. La funció main () veu el membre protegit de qualsevol classe, ja sigui base o derivada, del mateix especificador, privat, i té prohibit accedir-hi.

Si no es comenta el segon segment de codi de la funció main (), s'aplicarà la mateixa explicació. És a dir, la funció main () no podrà accedir a un membre protegit o privat de la classe derivada o de la classe base. Això és independent de si un membre protegit de la classe derivada podria accedir a un membre protegit de la classe base.

Classe derivada protegida amb membres protegits
Substituïu l'especificador públic per protegit a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: protegitTheCla{}

Torneu a posar el comentari dels segments de codi a la funció main (), si encara no s'ha fet. Compileu i executeu el programa i tingueu en compte que el resultat és com abans.

Classe derivada privada amb membres protegits
Substituïu l'especificador protegit per privat a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: privatTheCla

Compileu i executeu el programa i tingueu en compte que el resultat serà com abans.

Classe derivada pública amb membres privats
Substituïu l'especificador privat per públic a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: públicTheCla{}

Feu que els membres de la classe derivada siguin privats. Compileu i executeu el programa. El resultat no és diferent del cas de classe derivada pública amb membres protegits.

Classe derivada protegida amb membres privats
Substituïu l'especificador públic per protegit a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: protegitTheCla{}

Compileu i executeu el programa. Aquest resultat no és diferent del cas de la classe derivada protegida amb membres protegits.

Classe derivada privada amb membres privats
Substituïu l'especificador protegit per privat a la declaració de la classe derivada anterior, de la manera següent:

classeChildCla: privatTheCla{}

Compileu i executeu el programa. Aquest resultat no és diferent del cas de classe privada derivada amb membres protegits.

Conclusió

Els especificadors d'accés C ++ són les paraules privat, protegit i públic. Decideixen l'accés dels membres d'una classe. La regió d'un especificador d'accés comença des de la seva etiqueta, fins al final de la descripció de classe (definició) o fins a l'inici d'un altre especificador d'accés. Qualsevol membre d’una classe pot accedir a qualsevol altre membre d’aquesta mateixa classe. Cap membre privat d’una classe no pot accedir a cap funció externa, cap operador extern o una classe derivada.

El membre de la classe base s'ha de protegir perquè un membre de la classe derivada pugui accedir a un membre privat de la classe base. Aquest membre protegit de la classe base és vist com un membre privat de la classe base per una funció externa o un operador extern.

Es pot accedir a qualsevol membre públic d'una classe mitjançant qualsevol funció externa, qualsevol operador extern o una classe derivada.

Si no hi ha cap especificador d'accés en una classe, s'assumeix l'especificador privat. És a dir, l’especificador d’accés per defecte és privat.

Referències utilitzades en aquest treball