viernes, 25 de abril de 2008

Lenguaje C ++

Clases en C++

Cap. 9 de Joyanes#255
[ ~| DECLARACION]
[ ~| VISIBILIDAD DE UNA CLASE]
[ ~| CONSTRUCTORES]
[ ~| HERENCIA]
[ ~| CLASES ABSTRACTAS]
------------------------------------------------------------------


~| DECLARACION

/Una clase es la descripción de un objeto (cuadro diálogo, control, menú...) del que se puede generar una instancia; y de las acciones que se pueden realizar con él./


Una clase es una colección de objetos. Cada objeto es una 'instancia' de esa clase.

Los objetos comparten los mismos atributos (atributos o variables miembro); estos son sus propiedades. Tambien comparten la misma funcionalidad (funcionalidad o método miembro); es decir la manera de comportarse.

Algunas veces se utiliza el término 'metodo' por 'función miembro' por influencia del Smalltalk -el lenguaje orientado a objetos por excelencia-.

Cuando se declara una clase se pueden declarar las funciones y los datos. Los miembros datos pueden ser de cualquier tipo, incluyendo tipos definidos por el usuario.

Sintaxis:

class nombreClase
{
miembro dato1 //características o atributos
miembro dato2
...miembro datoN

funcion miembro1 // acciones u operaciones
funcion miembro2
...funcion miembroN

};

La declaración de una clase es similar a una 'estructura'. Ver [c:\BD-DATOS\array-18c.txt::& ESTRUCTURA].

Un miembro dato puede ser cualquier tipo de variable.

Una funcion miembro representa acciones que puede realizar la clase.

Una clase 'persona' podría ser así:

---
class Persona
{
//miembro dato

char ColorCabello[20];
float Altura;
int Peso;
int Edad;

// funciones miembro

void Pasear();
void Charlar();
void TintarPelo(char *NuevoColorPelo);
}
---

Las funciones miembro necesitan ser definidas. Las declaraciones de las funciones miembro (método) es similar a las declaraciones de funciones en C++. Es, simplemente, el 'prototipo' de la función. La función real se debe definir en cualquier parte de modo que el compilador conozca cuál es el código que ha de ejecutar cuando llame a la función miembro.

No existe límite en el nº de funciones miembro.

Se declaran, genralmene, fuera de la propia clase (aunque pueden hacerse en su interior: funciones 'inline').

Cuando se declara una función se debe cualificar el nombre de la función con el nombre de la clase. Esta sintaxis implica:

uso nombre clase :: nombre de la función.

Ej (referido al ejemplo anterior)

void Persona::Pasear()
{
... // Código que representa a la acción 'pasear'
}

void Persona::Charlar()
{
... // Código que representa a la acción 'charlar'
}


---

~| VISIBILIDAD DE UNA CLASE

Para los miembros de una clase hay 3 niveles de visibilidad:

·-> sección pública: todo es visible a las funciones miembro (métodos), incluyendo las instancias descendentes y sus funciones miembro.
·-> sección privada: ningun usuario de la clase puede acceder, sólo las funciones miembro pueden acceder a los miembros privados.
·-> sección protegida: unicamente las funciones miembro de su clase y sus descendientes pueden acceder. Las instancias no pueden.

La accesibilidad a los miembros se controla por especificadores de acceso.

Los tres especificadores son:
'public'
'private'
'protected'.

Sintaxis:

clas NombreClase
{
private:


protected:


public:


}

El ejemplo anterior, de Persona, se puede declarar así:

---
class Persona
{

private:
// miembro dato privado
char ColorCabello[20];
public:
// miembros dato público
float Altura;
int Peso;
int Edad;
private
// funciones miembro privadas

void Pasear();
public:
// funciones miembro públicas
void Charlar();
void TintarPelo(char *NuevoColorPelo);
}
---

Por defecto la definición de una clase es privado.

Hay razones por las cuales se puede desear hacer un miembro deuna clase de tipo privado. Por ej., asegurarse de que nadie pueda cambiar una variable miembro a menos que su cambio pueda ser verificado.

IMPORTANTE!! El acceso a miembros dato privado se debe hacer a traves de una función miembro que sea declarada pública.

---

~| CONSTRUCTORES

/Miembro de la Clase que captura la memoria asociada al objeto. Tiene el mismo nombre de la clase; no devuelve valores; puede tener parámetros/

Hay dos funciones miembro especiales que pueden declararse en cada clase: los constructores y los destructores.

El constructor se llama automaticamente por C++ siempre que una variable de ese tipo se crea (se instancia). Y el destructor se llama siempre que una instancia de la clase se destruye.

(para mayor detalle ver Joyanes#264ss)

En Schildt #31ss:

Un ejemplo que usa un constructor para inicializar automaticamente un objeto pila cuando se crea:

#include
define SIZE 10
//declara una clase pila para caracteres
class stack
{
char stack[SIZE]; //guarda la pila
int tos; //indice de la cabeza de la pila
public:
stack(); //constructor
void push(char ch); //mete un carácter en la pila
char pop(); //saca un caracter de la pila
};

...

Como se puede ver, ahora la tarea de inicialización la realiza automáticamente la función constructora en vez de una función separada que debe llamar el program explícitamente (...)



---

~| HERENCIA

En C++ el término sólo se aplica a 'clases', ni las variables ni las funciones pueden heredar.

Se permite la herencia simple (un clase se deriva de otra) y la múltiple (un clase se deriva de más de una).

La derivación (reutilización) de una clase de otra reutiliza el código de la clase base para sus nuevas necesidades.

Un sistema de clases que utiliza 'herencias' se llama 'jerarquía de clases'.

Una clase derivada se declara así:

class D : modificador_acceso B // por defecto es privado
{
// declaraciones de miembro
}

donde 'D' es el nombre de la clase derivada,
'modificador_acceso' es opcional (public, private, protected), y
'B' es el nombre de la clase base.

El modificador de acceso se utiliza para modificar la accesibilidad de miembros heredados.

class A // Clase base A
{
...
};

class B : A // Clase derivada B
{
...
};


En la clase derivada, B, (subclase) todas las funciones miembro de la clase ascendiente se heredan; con la excepción de los constructores, destructores y cualquier operador de asignación sobrecargado ( operador=() ), así como relaciones de amistad (friend).

El modificador de acceso permite realizar derivación pública, privada o protegida. Así, en una derivación pública:

class A {...}; // Clase base
...
class B : public A {...}; // Clase derivada

se pueden heredar todos los miembros y conservan todos ellos su modo de accesibilidad.

(más detalles en Joyanes#279)

---

~| CLASES ABSTRACTAS

Son clases que unicamente se pueden utilizar como clases bases; no se pueden utilizar para declarar (instanciar) objetos. Para declarar una bse abstracta es preciso que almenos una de sus funciones virtuales se declare como virtual pura. Una función virtual pura es aquella que no tiene cuerpo, que se inicializa a 0. Su sintaxis es:

virtual tiporetorno nombrefunción (listadeparametros) = 0

virtual void dibujar() = 0 // funcion virtual pura

No confundir con la declaración de una función virtual nula, que es así:

virtual void dibujar() {} // funcion virtual nula

(mas detalles en Joyanes#285)