Encapsulación

Las funciones son una interface a través de la cual se manipulan los datos almacenados en una clase. Usando estos métodos, podemos manipular y extraer datos de un objeto Caja sin saber qué tipos de datos se usan para almacenar los datos. Esto se conoce como encapsulación de datos, y es un concepto muy importante en la programación orientada a objetos. Encapsulación es la habilidad de una parte de un programa para ocultar sus datos al resto del código, impidiendo así accesos incorrectos o conflictos con los nombres de otras variables.

En el ejemplo anterior, cada clase tenía sólo una sección, etiquetada como public. Pero podemos utilizar también la etiqueta private. Así, la palabra public define hace que los campos (variables o funciones) que le siguen en la clase puedan ser accedidas desde cualquier parte del programa, mientras que la palabra private indica que los campos que le siguen sólo son accesibles por el código que forma parte de la misma clase.
Si no se indica lo contrario, por defecto en una clase todos los elementos son privados. Veamos un ejemplo:

# include <iostream.h>

class Caja {
    double longitud, anchura, altura;
  public:
    void set (double dim1, double dim2, double dim3);
    void print (void);
    double getLongitud (void);
};

void Caja :: set (double dim1, double dim2, double dim3)
{
    longitud = dim1;
    anchura = dim2;
    altura = dim3;
};

void Caja :: print (void)
{
    cout << "longitud = " << longitud <<'\n';
    cout << "anchura = " << anchura <<'\n';
    cout << "altura = " << altura <<'\n';
};

double Caja:: getLongitud (void) {
    return longitud;
};

main ()
{
   double longitud;    Caja pequeña, mediana, grande;

   pequeña.set(5, 4, 10);
   mediana.set (10, 6, 20);
   grande.set (20, 10, 30);

   pequeña.print();
   mediana.print();
   grande.print();

   longitud = grande.getLongitud();
   cout << "longitud de la caja grande = " << longitud <<'\n';
}

La ventaja de las funciones miembro es que la función llamada puede automáticamente acceder a los datos del objeto para el cual fue llamado. Así, en grande.print(), el objeto grande es el 'substrato': las variables longitud, altura y anchura que son utilizadas en el código de la función se refieren al objeto grande.

Más funciones.

La idea básica de la programación orientada a objetos es definir tipos de dato abstractos, y las operaciones o métodos que pueden actuar sobre ellos. Añadamos al ejemplo anterior una función que calcule el volumen de un objeto de la clase Caja:

# include <iostream.h>

class Caja {
    double longitud, anchura, altura;
  public:
    void set (double dim1, double dim2, double dim3);
    double volumen (void);
};

void Caja :: set (double dim1, double dim2, double dim3)
{
    longitud = dim1;
    anchura = dim2;
    altura = dim3;
};

double Caja:: volumen (void) {
    return longitud * anchura * altura;
};

main ()
{
   double longitud;    Caja pequeña, mediana, grande;

   pequeña.set(5, 4, 10);
   mediana.set (10, 6, 20);
   grande.set (20, 10, 30);

   cout << "El volumen de la caja grande es " << grande.volumen() << '\n';
}

Esto impide que al calcular el volumen de una caja mezclemos las dimensiones de dos objetos distintos. Dado que es una función con poco código, podemos definirla dentro de la declaración de clase:

# include <iostream.h>

class Caja {
    double longitud, anchura, altura;
  public:
    void set (double dim1, double dim2, double dim3);
    double volumen (void) {return longitud * anchura * altura;}
};

void Caja :: set (double dim1, double dim2, double dim3)
{
    longitud = dim1;
    anchura = dim2;
    altura = dim3;
};

main ()
{
   double longitud;
   Caja pequeña, mediana, grande;

   pequeña.set(5, 4, 10);
   mediana.set (10, 6, 20);
   grande.set (20, 10, 30);

}

Free Web Hosting