5.2. Control de acceso en C++

C++ introduce tres nuevas palabras reservadas para establecer las fronteras de una estructura: public, private y protected. Su uso y significado son bastante claros. Los especificadores de acceso se usan sólo 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 dos puntos (:).

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 reservada 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) ocultas, accesibles sólo para 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() es un miembro de B, lo que le garantiza automáticamente el acceso), una función global ordinaria como main() no puede. Por supuesto, tampoco pueden los métodos de otras estructuras. Sólo las funciones que aparezcan explícitamente en 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.

5.2.1. protected

El último especificador de acceso es protected, que actúa como private, con una excepción de la que aún no se puede hablar: las estructuras «heredadas» (que no pueden acceder a los miembros privados) sí tienen acceso a los miembros protected. Todo esto se verá más claramente en el Capítulo 14, cuando se presente la herencia. Con lo que sabe hasta ahora puede considerar protected igual que private.