Especificadores de acceso C ++

C Access Specifiers



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 miembro 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. 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
utilizando espacio de nombreshoras;

claseTheCla
{
privado:
En tnum1;
En tnum2;
público:
TheCla(En tn1,En tn2)
{
num1=n1;num2=n2;
}
En tmétodo()
{
regresonum1;
}
};

En tprincipal()
{
TheCla obj(10,20);
En tno2=obj.método();
costo<<no2<<' orte';

// int no1 = obj.num1;

regreso 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 instrucció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 público o privado.



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. Solo ha podido acceder 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 instrucció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:

claseTheCla
{
En tnum1;
En tnum2;
público:
TheCla(En tn1,En tn2)
{
num1=n1;num2=n2;
}
En tmétodo()
{
regresonum1;
}
};

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 instrucció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
utilizando espacio de nombreshoras;

claseTheCla
{
público:
En tnum1= 10;
protegido:
En tnum2= 20;
privado:
En tnum3= 30;
};

claseChildCla: públicoTheCla
{
público:
En tMétodo 1()
{
regresonum1;
}
En tmétodo2()
{
regresonum2;
}
/ * int método3 ()
{
return num3;
} */

};

En tprincipal()
{
ChildCla childObj;
En tno1=childObj.Método 1();
costo<<no1<<' orte';

En tno2=childObj.método2();
costo<<no2<<' orte';

regreso 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:

claseChildCla: públicoTheCla{}

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 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 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
Reemplace el especificador público por protected en la declaración de la clase derivada anterior, de la siguiente manera:

claseChildCla: protegidoTheCla{}

Compile y ejecute el programa y observe 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 pública 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:

claseChildCla: privadoTheCla{}

Compile y ejecute el programa y observe 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 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
utilizando espacio de nombreshoras;

claseTheCla
{
público:
En tnum1= 10;
protegido:
En tnum2= 20;
privado:
En tnum3= 30;
};

claseChildCla: públicoTheCla
{
protegido:
En tMétodo 1()
{
regresonum1;
}
En tmétodo2()
{
regresonum2;
}
/ * int método3 ()
{
return num3;
} */

};

En tprincipal()
{
/ * ChildCla childObj;
int no1 = childObj.method1 ();
costo<
/ * int no2 = childObj.method2 ();
costo<
regreso 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, privados. 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
Reemplace el especificador público por protected en la declaración de la clase derivada anterior, de la siguiente manera:

claseChildCla: protegidoTheCla{}

Vuelva a colocar el comentario de los segmentos de código en la función main (), si aún no lo ha hecho. Compile y ejecute el programa y observe que el resultado es el mismo que 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:

claseChildCla: privadoTheCla

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:

claseChildCla: públicoTheCla{}

Haga que los miembros de la clase derivada sean privados. 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
Reemplace el especificador público por protected en la declaración de la clase derivada anterior, de la siguiente manera:

claseChildCla: protegidoTheCla{}

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 con privado en la declaración de la clase derivada anterior, de la siguiente manera:

claseChildCla: privadoTheCla{}

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. 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 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.

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