C ++

Especificadores de acceso C ++

Especificadores de acceso C ++
En C ++, una clase es un conjunto de variables y funciones que se han configurado para trabajar juntas. Cuando se dan valores a las variables de la clase, se obtiene un objeto. Un objeto tiene las mismas variables y funciones que una clase, pero esta vez, las variables tienen valores. Se pueden crear muchos objetos a partir de una clase. Un objeto se diferencia de otro objeto según el conjunto diferente de valores asignados a las variables del otro objeto. Se dice que crear un objeto a partir de una clase es instanciar el objeto. Incluso si dos objetos diferentes tienen los mismos valores para sus variables, estos objetos son entidades diferentes, identificadas por diferentes nombres en el programa. Las variables de un objeto y su clase correspondiente se denominan miembros de datos. Las funciones de un objeto y su clase correspondiente se denominan funciones miembro. Los miembros de datos y las funciones de los miembros se denominan miembros.

La palabra acceso significa leer o cambiar el valor de una variable, y también significa usar una función. Los especificadores de acceso de C ++ son las palabras "privado", "protegido" y "público.”Ellos deciden si un miembro puede acceder a otros miembros de su clase, o si una función u operador fuera de la clase y que no pertenece a la clase puede acceder a cualquier miembro de la clase. También deciden si un miembro de una clase derivada (secundaria) puede acceder a un miembro de una clase principal.

Se requieren conocimientos básicos de C ++ para comprender este artículo y probar el código proporcionado.

Contenido del artículo

Los especificadores públicos y privados

Clase
Cualquier miembro de una clase puede acceder a cualquier otro miembro de la misma clase, independientemente de que esté etiquetado como "público" o "privado".”Considere el siguiente programa:

#incluir
usando el espacio de nombres std;
clase TheCla

privado:
int num1;
int num2;
público:
TheCla (int n1, int n2)

num1 = n1; num2 = n2;

int método ()

return num1;

;
int main ()

TheCla obj (10, 20);
int no2 = obj.método();
cout<// int no1 = obj.num1;
return 0;

La salida es 10. Los miembros privados son num1 y num2. Los miembros públicos son TheCla () y method (). Tenga en cuenta que TheCla () es la función constructora que inicializa las variables de interés. La región de un especificador de acceso comienza desde su etiqueta hasta el final de la descripción de la clase (definición) o hasta el comienzo de otro especificador de acceso.

En la función main (), la primera declaración es la instanciación que involucra a la función constructora, que inicializa num1 y num2. La siguiente declaración llama al miembro público, método (), de la clase.

Ahora, en la descripción de la clase (definición), la función de miembro público, TheCla (), accede a los miembros privados, num1 y num2. Además, la función de miembro público, método (), accede al miembro privado, num1. Cualquier miembro dentro de una descripción de clase puede acceder a cualquier otro miembro dentro de la misma descripción de clase; no importa qué miembro sea privado o público.

Sin embargo, una función u operador no declarado en la descripción de la clase y fuera de la descripción de la clase solo puede acceder a los miembros públicos de la clase. La función main (), por ejemplo, es una función declarada fuera de la descripción de la clase. Ha podido acceder solo al método () y a los miembros públicos de TheCla (). Dentro de la función main (), la función TheCla () es obj (10, 20).

Una función externa o un operador externo, como la función main (), no puede acceder a ninguno de los miembros privados de la clase, como num1 o num2. Elimina el indicador de comentario, //, de la última declaración menos una en main (). Si intenta compilar el programa, tenga en cuenta que el programa no se compilará, dando un mensaje de error.

Especificador predeterminado
El especificador predeterminado para una clase es "privado.”Entonces, la descripción de clase anterior es la misma que la siguiente descripción, privada, pero sin el especificador:

clase TheCla

int num1;
int num2;
público:
TheCla (int n1, int n2)

num1 = n1; num2 = n2;

int método ()

return num1;

;

Nota: la etiqueta del especificador de acceso comienza con el especificador y luego va seguida de dos puntos.

El especificador protegido

Dentro de una descripción de clase, y desde una función externa o un operador externo, el especificador protegido es el mismo que el especificador privado. Ahora, reemplace el especificador privado en el programa anterior con el especificador, proteja y elimine el indicador de comentario, //, de la última declaración menos una en la función main (). Si intenta compilar el programa, tenga en cuenta que el programa no se compilará, dando un mensaje de error.

El problema del especificador protegido surge cuando los miembros de la clase derivada (heredada) deben acceder a los miembros de la clase base (padre).

Clase derivada pública con miembros públicos
Considere el siguiente programa:

#incluir
usando el espacio de nombres std;
clase TheCla

público:
int num1 = 10;
protegido:
int num2 = 20;
privado:
int num3 = 30;
;
clase ChildCla: público TheCla

público:
int método1 ()

return num1;

int método2 ()

return num2;

/ * int método3 ()

return num3;
* /
;
int main ()

ChildCla childObj;
int no1 = childObj.Método 1();
cout<int no2 = childObj.método2 ();
cout<return 0;

La salida es:
10
20

En la clase base, num1 es público, num2 está protegido y num3 es privado. En la clase derivada, todas las funciones miembro son públicas. La primera función, método1 (), accede al miembro de datos públicos, num1. La segunda función, método2 (), accede al miembro de datos protegidos, num2. La tercera función, method3 (), aunque actualmente comentada, debería acceder al miembro de datos privados, num3.

Una clase derivada no se declara sin un especificador de acceso (público, protegido o privado). Arriba, la clase derivada se declara con el especificador público, es decir:

clase ChildCla: public TheCla

Ahora elimine los comentarios de la definición de función del tercer miembro en la clase derivada. Si intenta compilar el programa, tenga en cuenta que no se compilará, dando un mensaje de error.

Nota: Cuando toda la clase derivada se declara pública, sus miembros no pueden acceder a los miembros privados de la clase base. Sin embargo, sus miembros pueden acceder al público y a los miembros protegidos de la clase base. El programa anterior ilustra esto.

Sin embargo, tenga en cuenta que un miembro público de la clase derivada pública puede acceder a un miembro protegido de la clase base.

Especificadores de clase derivados y especificadores de miembros

Clase derivada protegida con miembros públicos
Reemplazar el especificador "público" por "protegido" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: protegida TheCla

Compile y ejecute el programa y tenga en cuenta que el resultado es el mismo que antes.

Entonces, cuando toda la clase derivada se declara protegida, sus miembros no pueden acceder a los miembros privados de la clase base. Sin embargo, sus miembros pueden acceder al público y a los miembros protegidos de la clase base. Esto es lo mismo que cuando la clase derivada se declara pública.

Nota: un miembro protegido de la clase derivada pública puede acceder a un miembro protegido de la clase base.

Clase derivada privada con miembros públicos
Reemplazar el especificador "protegido" por "privado" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: privado TheCla

Compile y ejecute el programa y tenga en cuenta que el resultado es el mismo que antes.

Entonces, cuando toda la clase derivada se declara privada, sus miembros no pueden acceder a los miembros privados de la clase base. Sin embargo, sus miembros pueden acceder al público y a los miembros protegidos de la clase base. Esto es lo mismo que cuando la clase derivada se declara protegida o pública.

Clase derivada pública con miembros protegidos
Escriba, compile y ejecute el siguiente programa, en el que toda la clase derivada está protegida y sus miembros también están protegidos. Algunos segmentos de código son los siguientes:

#incluir
usando el espacio de nombres std;
clase TheCla

público:
int num1 = 10;
protegido:
int num2 = 20;
privado:
int num3 = 30;
;
clase ChildCla: público TheCla

protegido:
int método1 ()

return num1;

int método2 ()

return num2;

/ * int método3 ()

return num3;
* /
;
int main ()

/ * ChildCla childObj;
int no1 = childObj.Método 1();
cout</ * int no2 = childObj.método2 ();
cout<return 0;

El programa funciona como está. No hay salida, y no se supone que haya ninguna salida, según cómo se haya escrito el programa.

Ahora, elimine los comentarios de la definición de función, method3 (), en la clase derivada. Si intenta compilar el programa, tenga en cuenta que no se compilará, dando un mensaje de error. Esto significa que no se puede acceder a un miembro privado desde una función externa, un operador externo o una clase derivada. Esta es la misma conclusión que se concluyó anteriormente, con respecto al acceso a un miembro privado.

Nota: un miembro protegido de la clase derivada protegida puede acceder a un miembro protegido de la clase base.

Ahora, vuelva a colocar los comentarios en la clase derivada y elimine los comentarios del primer segmento de código en la función main (). Si intenta compilar el programa, tenga en cuenta que el programa no se compilará debido al primer segmento de código en la función main (). Este efecto no es nuevo. Aparte de la clase derivada, las funciones externas y los operadores externos, los miembros protegidos y privados de una clase (base o derivada) son del mismo especificador, privado. La función main () ve el miembro protegido de cualquier clase, ya sea base o derivada, como del mismo especificador, privado, y tiene prohibido acceder a él.

Si el segundo segmento de código de la función main () no está comentado, se aplicará la misma explicación. Es decir, la función main () no podrá acceder a un miembro protegido o privado de la clase derivada o de la clase base. Esto es independiente de si un miembro protegido de la clase derivada podría acceder a un miembro protegido de la clase base.

Clase derivada protegida con miembros protegidos
Reemplazar el especificador "público" por "protegido" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: protegida TheCla

Vuelva a colocar el comentario de los segmentos de código en la función main (), si esto aún no se ha hecho. Compile y ejecute el programa y observe que el resultado es el mismo que antes.

Clase derivada privada con miembros protegidos
Reemplazar el especificador "protegido" por "privado" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: privado TheCla

Compile y ejecute el programa y tenga en cuenta que el resultado será el mismo que antes.

Clase derivada pública con miembros privados
Reemplace el especificador "privado" por "público" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: public TheCla

Hacer privados los miembros de la clase derivada. Compilar y ejecutar el programa. El resultado no es diferente del caso "Clase derivada pública con miembros protegidos".

Clase derivada protegida con miembros privados
Reemplazar el especificador "público" por "protegido" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: protegida TheCla

Compilar y ejecutar el programa. Este resultado no es diferente del caso "Clase derivada protegida con miembros protegidos".

Clase derivada privada con miembros privados
Reemplace el especificador "protegido" por "privado" en la declaración de la clase derivada anterior, de la siguiente manera:

clase ChildCla: privado TheCla

Compilar y ejecutar el programa. Este resultado no es diferente del caso "Clase derivada privada con miembros protegidos".

Conclusión

Los especificadores de acceso de C ++ son las palabras "privado", "protegido" y "público."Ellos deciden el acceso de los miembros de una clase. La región de un especificador de acceso comienza desde su etiqueta, hasta el final de la descripción de la clase (definición) o hasta el comienzo de otro especificador de acceso. Cualquier miembro de una clase puede acceder a cualquier otro miembro de esa misma clase. No se puede acceder a un miembro privado de una clase mediante ninguna función externa, ningún operador externo o una clase derivada.

El miembro de la clase base debe estar protegido para que un miembro de la clase derivada pueda acceder a un miembro privado de la clase base. Este miembro protegido de la clase base es visto como un miembro privado de la clase base por una función externa o un operador externo.

Se puede acceder a un miembro público de una clase mediante cualquier función externa, cualquier operador externo o una clase derivada.

En ausencia de cualquier especificador de acceso en una clase, se asume el especificador privado. Es decir, el especificador de acceso predeterminado es privado.

Referencias utilizadas en este trabajo

  • Alireza Ebrahimi, HERENCIA: REUTILIZACIÓN Y EXTENSIBILIDAD
  • S. Malik, estructuras de datos con C ++ 2da edición
OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...
Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....
SuperTuxKart para Linux
SuperTuxKart es un gran título diseñado para ofrecerte la experiencia Mario Kart de forma gratuita en tu sistema Linux. Es bastante desafiante y diver...