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 las variables de la clase se dan valores, 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 difiere de otro objeto de acuerdo con el conjunto diferente de valores asignados a las variables del otro objeto. Se dice que crear un objeto a partir de una clase está instanciando 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 para un objeto y su clase correspondiente se denominan miembros de datos. Las funciones de un objeto y su clase correspondiente se denominan funciones miembros. Los miembros de los 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 C ++ son las palabras, "privadas", "protegidas" y "públicas."Deciden si un miembro puede acceder a otros miembros de su clase, o si una función u operador fuera de la clase y no pertenecer a la clase puede acceder a cualquier miembro de la clase. También deciden si un miembro de una clase derivada (infantil) puede acceder a un miembro de una clase matriz.

Se requiere un conocimiento básico de C ++ para comprender este artículo y probar el código proporcionado.

Contenido del artículo

  • Los especificadores públicos y privados
  • El especificador protegido
  • Especificadores de clase derivados y especificadores de miembros
  • Conclusión

Los especificadores públicos y privados

Clase
Cualquier miembro de una clase puede acceder a cualquier otro miembro de esa misma clase, independientemente de la cual 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;

método int ()

devolver num1;

;
int main ()

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

La salida es 10. Los miembros privados son num1 y num2. Los miembros públicos son thecla () y método (). Tenga en cuenta que thecla () es la función de constructor que inicializa 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 al inicio de otro especificador de acceso.

En la función main (), la primera declaración es la instancia que involucra la función del constructor, 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 la clase; no importa qué miembro sea privado o público.

Sin embargo, una función u operador que no se declara 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 thecla (). Dentro de la función main (), la función thecla () es obj (10, 20).

Una función externa o un operador exterior, como la función Main (), no puede acceder a ninguno de los miembros privados de la clase, como NUM1 o NUM2. Elimine el indicador de comentarios, //, de la última declaración pero 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 la 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;

método int ()

devolver num1;

;

Nota: La etiqueta del especificador de acceso comienza con el especificador, y luego es seguido por un colon.

El especificador protegido

Dentro de una descripción de clase, y desde una función externa o 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 comentarios, //, de la última declaración pero en la función principal (). Si intenta compilar el programa, tenga en cuenta que el programa no se compilará, dando un mensaje de error.

La cuestión del especificador protegido aparece cuando los miembros de la clase derivada (heredada) deben acceder a los miembros de la clase base (matriz).

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: Public Thecla

público:
int método1 ()

devolver num1;

int método2 ()

devolver num2;

/*int Method3 ()

regreso num3;
*/
;
int main ()

ChildCla Childobj;
int no1 = childobj.Método 1();
cout<int no2 = childobj.método2 ();
cout<regresar 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 de los miembros son públicas. La primera función, Method1 (), accede al miembro de datos públicos, Num1. La segunda función, Method2 (), accede al miembro de datos protegidos, Num2. La tercera función, Method3 (), aunque comentada actualmente, debe 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:

class ChildCla: public thecla

Ahora no comment la tercera definición de función de 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 a los miembros públicos y protegidos de la clase base. El programa anterior ilustra esto.

Sin embargo, tenga en cuenta que un miembro público de la clase derivada del público 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
Reemplace el especificador "público" con "protegido" en la declaración de la clase derivada anterior, de la siguiente manera:

class ChildCla: protegió thecla

Compilar y ejecutar 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 a los miembros públicos y 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 del público puede acceder a un miembro protegido de la clase base.

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

class ChildCla: Private Thecla

Compilar y ejecutar 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 a los miembros públicos y protegidos de la clase base. Esto es lo mismo que cuando la clase derivada se declara protegida o pública.

Clase derivada del público con miembros protegidos
Tipo, 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: Public Thecla

protegido:
int método1 ()

devolver num1;

int método2 ()

devolver num2;

/*int Method3 ()

regreso num3;
*/
;
int main ()

/*Childcla Childobj;
int no1 = childobj.Método 1();
cout</*int no2 = childobj.método2 ();
cout<regresar 0;

El programa funciona como es. No hay salida, y no se supone que haya resultado, en función de cómo se ha escrito el programa.

Ahora, Un Comment la definición de función, método3 (), 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, operador externo o 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 un comment el 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. Además de la clase derivada, las funciones externas y los operadores externas, los miembros protegidos y privados de una clase (base o derivada) son del mismo especificador, privado. La función main () ve al miembro protegido de cualquier clase, ya sea base o derivado, a partir del mismo especificador, privado, y se le prohíbe acceder a él.

Si el segundo segmento de código de la función main () no se comenta, se aplicará la misma explicación. Es decir, la función principal () 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
Reemplace el especificador "público" con "protegido" en la declaración de la clase derivada anterior, de la siguiente manera:

class ChildCla: protegió thecla

Volver a colocar el comentario de los segmentos de código en la función principal (), si esto no se ha hecho aún. Compilar y ejecutar el programa y tenga en cuenta que el resultado es como antes.

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

Clase ChildCla: Privado THECLA

Compilar y ejecutar el programa y observe que el resultado será como antes.

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

class ChildCla: public thecla

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

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

class ChildCla: protegió thecla

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

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

class ChildCla: Private Thecla

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

Conclusión

Los especificadores de acceso C ++ son las palabras "privadas", "protegidas" y "públicas."Deciden el acceso para 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 al inicio 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 por ninguna función externa, ningún operador externo o una clase derivada.

El miembro de la clase base debe protegerse 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. Una función externa puede acceder a un miembro público de una clase, cualquier operador externo o una clase derivada. En ausencia de cualquier especificador de acceso en una clase, se supone el especificador privado. Es decir, el especificador de acceso predeterminado es privado.