C++ introduce tres nuevas palabras clave para establecer las
fronteras de una estructura: public
, private
y
protected.
Su uso y significado es bastante claro. Los
especificadores de acceso se usan solo en la
declaración de las estructuras, y cambian las fronteras para todas
las declaraciones que los siguen. Cuando use un especificador de
acceso, debe ir seguido de «:»
public
significa que todas las declaraciones de
miembros que siguen estarán accesibles para cualquiera. Los miembros
public
son como miembros de una estructura. Por
ejemplo, las siguientes declaraciones de estructuras son
idénticas:
//: C05:Public.cpp // Public is just like C's struct struct A { int i; char j; float f; void func(); }; void A::func() {} struct B { public: int i; char j; float f; void func(); }; void B::func() {} int main() { A a; B b; a.i = b.i = 1; a.j = b.j = 'c'; a.f = b.f = 3.14159; a.func(); b.func(); } ///:~
Listado 5.1. C05/Public.cpp
La palabra clave private
, por otro lado, significa que
nadie podrá acceder a ese miembro excepto usted, el creador del
tipo, dentro de los métodos de ese tipo. private
es una
pared entre usted y el programador cliente; si alguien intenta
acceder a un miembro private
, obtendrá un error en
tiempo de compilación. En struct B
en el
ejemplo anterior, podría querer hacer partes de la
representación (es decir, los atributos) ocultos, accesibles
solo a usted:
//: C05:Private.cpp // Setting the boundary struct B { private: char j; float f; public: int i; void func(); }; void B::func() { i = 0; j = '0'; f = 0.0; }; int main() { B b; b.i = 1; // OK, public //! b.j = '1'; // Illegal, private //! b.f = 1.0; // Illegal, private } ///:~
Listado 5.2. C05/Private.cpp
Aunque func()
puede acceder a cualquier
miembro de B
(pues
func()
en un miembro de
B
, garantizando así automáticamente el
acceso), una función global ordinaria como
main()
no puede. Por supuesto tampoco
miembros de otras estructuras. Solo las funciones que
pertenezcan a la declaración de la estructura (el
«contrato») tendrán acceso a miembros
private
.
No hay un orden fijo para los especificadores de acceso, y pueden aparecer más de una vez. Afectan a todos los miembros declarados después de ellos hasta el siguiente especificador.
Es el último que nos queda por ver, protected
actúa
como private
, con una excepción de la que hablaremos
más tarde: estructuras heredadas (que no pueden acceder a lo
miembros privados) si tienen acceso a los miembros
protected
. Todo esto se verá más claramente en el
capítulo 14 cuando veamos la herencia. Con lo que sabe hasta
ahora puede considerar protected
igual que
private
.