5.2. Control de acceso en C++

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

5.2.1. protected

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.