viernes, 30 de julio de 2010

UNIDAD 4


UNIDAD 4. CLASES Y OBJETOS
4.1 DEFINICION DE UNA CLASE
Aquí tenemos la sintaxis para definir una clase:
ModifAcceso modifClase class nombreClase [extends nombreBase] [implements listaInterfaces] {
Atributo 1
Atributo N
Método 1
Método N
}
Donde nombreClase es el nombre de la clase, cualquier nombre, pero respetando las reglas de nomenclatura del lenguaje.
ModifAcceso puede ser uno de los siguientes valores: Public indica que la clase es pública, y por tanto que puede ser utilizada desde cualquier otra clase, con independencia de si están en el mismo paquete o no.
Sin especificar indica que la clase tiene visibilidad de paquete, es decir, sólo la pueden usar las clases que se encuentren en el mismo paquete que dicha clase.
ModifClase indica características específicas de la clase que estamos construyendo, los posibles
valores son:
abstract indica que a la clase le falta, al menos uno, el código de algún método. Posee el método (abstracto), pero no tiene el código de ese método, siendo responsabilidad de las clases derivadas proporcionar el código de dicha clase. Una clase abstracta no se puede instanciar. Final se emplea para evitar que esta clase pueda ser derivada.
Extends se utiliza para indicar que la clase hereda de nombreBase, en java sólo se permite heredar de una única clase base. En caso de no incluir la cláusula extends, se asumirá que se está heredando directamente de la clase java.lang.Object Implements indica que esta clase es de los tipos de interfaz indicados por listaInterfaces, pudiendo existir tantos como queramos separados por comas. Esta cláusula es opcional.
La definición de una clase especifica cómo serán los objetos de dicha clase, esto es, de que variables y de que métodos constarán. La siguiente es la definición más simple de una clase:
class nombreClase /* Declaración de la clase */
4.2 DECLARACION DE CLASES
La declaración de una clase define la estructura de la misma. Dicho de otra forma, la declaración de una clase informa de los elementos que la conforman. Posteriormente a ser declarada, una clase debe ser implementada convenientemente, es decir, se debe escribir el código correspondiente a los procedimientos y funciones que determinan el funcionamiento de esa clase.
Indica el nombre de la clase precedido por la palabra clave class.
Para declarar una clase, todo lo que se necesita es escribir una definición de estructura y sustituir la palabra reservada struct por class. Por ejemplo, una clase empleado con campos como el nombre, el departamento, la posición, el una función que nos imprima la información de este.
Quedaría así:
class Empleado {
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
void Imprimir( Empleado infoEmpleado);
}
Cuando usted declara una clase en C++, no se reserva memoria para la clase hasta que usted crea un objeto de la clase. Crear un objeto de una clase se llama instanciar un objeto. Un objeto creado de una clase de denomina instancia de una clase. Por ejemplo, yo puedo tener una instancia de empleado con el valor en m_nombre=Jose, m_departamento=Sistemas, m_posicion=programador y m_salario=3000000.
4.3 MIEMBROS DE UNA CLASE
Los miembros (datos miembros y funciones miembro) de una clase puede ser calificado como miembro estable de la declaración anterior con la palabra clave estática. Puede haber miembros de los datos estáticos y funciones miembro de una clase.
Los miembros de Datos Un miembro de datos estáticos de una clase es como una variable global para su clase. Es decir, los datos disponibles a nivel mundial es miembro de todos los objetos de ese tipo de clase. Los datos estáticos son generalmente mantenidos para almacenar los valores comunes a toda la clase. Por ejemplo, una clase puede tener un miembro de mantenimiento de los datos de seguimiento de su número de objetos existentes.
Un miembro de los datos es diferente de los miembros ordinarios de datos de una clase en varios
aspectos:
• Sólo hay una copia de un miembro de los datos mantenida por la totalidad de la clase que es compartida por todos los objetos de esa clase.
• Es visible sólo dentro de la clase, sin embargo, su duración (el tiempo para el que permanece en la memoria) es el programa entero. Dos cosas son necesarias para la fabricación de un miembro
de datos estáticos:
• Declaración en la definición de la clase
• Definición fuera de la definición de la clase
Los miembros de función Un miembro de la función que accede a la estática sólo los miembros de una clase puede ser declarada como estática. Esto puede hacerse mediante la palabra clave estática antes de la declaración de la función en la definición de la clase como se muestra a continuación:
La clase X (static int count; static void mostrar (void) (tribunal <
Sólo por el prefijo palabra clave estática antes de la declaración de la función en la definición de la clase, le han declarado la función como estática.
Una función miembro estática es diferente de los otros miembros de funciones en varios aspectos:
• Una función miembro puede tener acceso sólo los miembros estáticos (funciones o variables) de la misma clase.
• Una función miembro se invoca utilizando el nombre de la clase en lugar de sus objetos como se muestra a continuación:
clase name.function-nombre ();
Es decir, para llamar a la función estática show () se define por encima de la clase X, se escribe X.show ();
4.4 AMBITO REFERENTE A UNA CLASE

Una clase actúa como cualquier otro tipo de dato con respecto al ámbito. Todos los miembros de una clase se dice que están en el ámbito de esa clase; cualquier miembro de una clase puede referenciar a cualquier otro miembro de la misma clase.
Las funciones miembro de una clase tienen acceso no restringido a los miembros dato de esa clase. El acceso a los miembros dato y funciones de una clase fuera del ámbito de la clase está controlado por el programador. La idea es encapsular la estructura de datos y funcionalidad de una clase, de modo que el acceso a la estructura de datos de la clase desde fuera de las funciones miembro de la clase, sea limitada o innecesaria.
El nombre de la clase tiene que ser único dentro de su ámbito.Especificadores de acceso a los miembros de una clase
En una definición de clase, un especificador de acceso se utiliza para controlar la visibilidad de los miembros de una clase fuera del ámbito de la clase.
Los miembros de una clase pueden ser públicos, privados o protegidos. Las palabras reservadas public, private y protected se utilizan para controlar el modo de acceso a la clase.
Dentro de una declaración de clase, cada una de estas palabras se puede utilizar para preceder a una o más declaraciones de los miembros de una clase:- Acceso protegido.
Los miembros protegidos significan que sólo se puede acceder a ellos por funciones miembro dentro de la misma clase y por funciones miembro de clases derivadas de esta clase.- Acceso público. Los miembros públicos son accesibles por cualquier parte del programa.- Acceso privado. Los miembros privados sólo pueden ser utilizados por las funciones miembro de la clase y las funciones amigas de la clase.
Funciones miembro Son miembros de una clase y son funciones diseñadas para implementar las operaciones permitidas sobre los tipos de datos de una clase. Para declarar una función miembro hay que situar su prototipo en el cuerpo de la clase. No hay que definir la función dentro de la clase; dicha definición puede estar fuera de la clase e incluso en un archivo independiente, aunque también pueden ser definidas en línea dentro de la clase.
Las funciones miembro son necesarias para acceder a los datos privados. En general, son públicas; si no lo fueran, ninguna otra función podría llamarlas. Se pueden declarar para devolver valores con tipos incluyendo objetos de clases, punteros o referencias. Pueden ser declaradas también para aceptar cualquier número y tipo de argumentos. Los argumentos por defecto están permitidos, así como la notación de puntos suspensivos.

4.5 ESPECIFICADORES DE ACCESO

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 “:” .
4.6 CREACION DE OBJETOS

Para disponer de espacio en la memoria para guardar la información de uno de esos alumnos tendremos que crear un objeto con el patrón (clase) alumno. Los objetos se crean con la palabra reservada new.
En la siguiente instrucción:
uno = new alumno();
Creamos un objeto de la clase alumno que referenciamos con la variable uno

La variable tendrá que haberse declarado antes, y la declaramos como una variable del tipo alumno, ya que la vamos a usar para guardar información de objetos del tipo alumno.
Un programa con la declaración de la variable y la creación del objeto sería:
public class p2t1p5{
public static void main(String[] args){
alumno uno; // 1
uno = new alumno(); // 2
uno.nombre = "Joan"; // 3
uno.apellido = "Rosell Mas"; // 4
System.out.println(uno.nombre + " " + uno.apellido);
}
}
4.7 PUNTERO THIS
This es un puntero que se pasa automáticamente a cualquier miembro cuando se invoca. Es un puntero al objeto que genera la llamada, por tanto la función recibe automáticamente un puntero al objeto. A este puntero se referencia como this y solo se pasa a los miembros punteros this.
objeto.funcion(); // a la función recibe automáticamente el puntero this.
This es un puntero al objeto invocante. Este puntero es pasado automáticamente por el compilador como argumento en todas las llamadas a funciones miembro (no estáticas). Como su inclusión es automática y transparente para el programador, es frecuente referirse a él como argumento implícito u oculto.
El resultado es que cuando el compilador encuentra una invocación (con o sin argumentos) del tipo x.pow2(), calcula la dirección del objeto (&x), y realiza una invocación del tipo pow2(&x), utilizando esta dirección como valor del argumento oculto this. Por supuesto, el compilador añade por su cuenta el argumento correspondiente en la definición de la función X::pow2().
This es un puntero muy especial que no puede ser declarado explícitamente, por lo que la definición void pow2(X* this) { /* ... */ } no sería válida. Tampoco puede tomarse su dirección o ser utilizado como Rvalue para una asignación del tipo this = x (si puede en cambio ser utilizado como Lvalue).
this es una variable local
Como ocurre con todos los parámetros de funciones, resulta que this es una variable local (puntero) presente en el cuerpo de cualquier función miembro no estática. this no necesita ser declarado, y es raro que sea referenciado explícitamente en la definición de alguna función, lo que no es obstáculo para que sea utilizado dentro de la propia función para referenciar a los miembros.
Según lo anterior resulta evidente que, como tal variable local, esta palabra clave no puede ser usada fuera del cuerpo de un método de una clase.
En el siguiente ejemplo se definen dos clases, idénticas salvo en la forma de referenciar a sus miembros; en una se utiliza el puntero this de forma explícita, en otra de forma implícita, ambas son equivalentes, aunque es más normal utilizar la forma implícita.
Ejemplo:
#include
class X {
int x;
public:
int getx() { return x; }
void putx (int i) { x = i;
}};
class Y
{
4.8 CONSTRUCTORES Y DESTRUCTORES.
Constructores
Los constructores son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En su declaración no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Al igual que otros métodos, puede haber varios constructores sobrecargados, aunque no pueden existir constructores virtuales.
Como característica especial a la hora de implementar un constructor, justo después de la declaración de los parámetros, se encuentra lo que se llama "lista de inicializadores". Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir.
Cabe destacar que no es necesario declarar un constructor al igual que un destructor, pues el compilador lo puede hacer, aunque no es la mejor forma de programar.Tomando el ejemplo de la Clase Punto, si deseamos que cada vez que se cree un objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un constructor.
Existen varios tipos de constructores en C++:
Constructor predeterminado: Es el constructor que no recibe ningún parámetro en la función. Si no se definiera ningún constructor, el sistema proporcionaría uno predeterminado. Es necesario para la construcción de estructuras y contenedores de la STL.
Constructor de copia: Es un constructor que recibe un objeto de la misma clase, y realiza una copia de los atributos del mismo. Al igual que el predeterminado, si no se define, el sistema proporciona uno.
Constructor de conversión: Este constructor, recibe como único parámetro, un objeto o variable de otro tipo distinto al suyo propio. Es decir, convierte un objeto de un tipo determinado a otro objeto del tipo que estamos generando.
Destructores
Los destructores son funciones miembro especiales llamadas automáticamente en la ejecución del programa, y por tanto no tienen por qué ser llamadas explícitamente por el programador. Su cometido es liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecución al expirar este.
Los destructores son invocados automáticamente al alcanzar el flujo del programa el fin del ámbito en el que está declarado el objeto.
Existen dos tipos de destructores pueden ser públicos o privados, según si se declaran:
si es público se llama desde cualquier parte del programa para destruir el objeto.
si es privado no se permite la destrucción del objeto por el usuario.
El destructor es muy similar al constructor, excepto que es llamado automáticamente cuando cada objeto sale de su ámbito de validez. Recordemos que las variables automáticas tienen un tiempo de vida limitado, ya que dejan de existir cuando se sale del bloque en que han sido declaradas.
Cuando un objeto es liberado automáticamente, su destructor, si existe, es llamado automáticamente.Un destructor tiene el mismo nombre que la clase a la que pertenece, pero precedido con una tilde (~). Igual que el constructor, un destructor no devuelve nada.
Si algún bloque de memoria fue reservado dinámicamente en un objeto, se puede utilizar el destructor para liberarlo antes de que se pierdan los punteros a esas variables.

No hay comentarios:

Publicar un comentario