5 Implementacion de La Clase

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 15

5.

IMPLEMENTACION DE LA CLASE Ahora que ya sabemos como crear, utilizar y destruir objetos, es hora de aprender cmo escribir clases de las que crear esos objetos. Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La implementacin de una clase comprende dos componentes: la declaracin y el cuerpo de la clase. DeclaracinDeLaClase { CuerpoDeLaClase } La Declaracin de la Clase Como mnimo, la declaracin de una clase debe contener la palabra clave class y el nombre de la clase que est definiendo. As la declaracin ms sencilla de una clase se parecera a esto. class NombredeClase { ... } Por ejemplo, esta clase declara una nueva clase llamada NumeroImaginario. class NumeroImaginario { ... } Los nombres de las clases deben ser un identificador legal de Java y, por convencin, deben empezar por una letra mayscula. Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin embargo, la declaracin de una clase puede decir ms cosas sobre la clase. Ms especificamente, dentro de la declaracin de la clase se puede.

declarar cual es la superclase de la clase. listar los interfaces implementados por la clase declarar si la clase es pblica, abstracta o final

Declarar la Superclase de la Clase En Java, todas las clases tienen una superclase. Si no se especifica una superclase para una clase, se asume que es la clase Object (declarada en java.lang). Entonces la superclase de NumeroImaginario es Object porque la declaracin no explicit ninguna otra clase. Para obtener ms informacin sobre la clase Object, puede ver La clase Object. Para especificar explcitamente la superclase de una clase, se debe poner la palabra clave extends ms el nombre de la superclase entre el nombre de la clase que se ha creado y la llave abierta que abre el cuerpo de la clase, as. class NombredeClase extends NombredeSuperClase {

... } Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase Number en vez de la clase Object. Se podra escribir esto. class NumeroImaginario extends Number { ... } Esto declara explcitamente que la clase Number es la superclase de NumeroImaginario. (La clase Number es parte del paquete java.lang y es la base para los enteros, los nmeros en coma flotante y otros nmeros). Declarar que Number es la superclase de NumeroImaginario declara implcitamente que NumeroImaginario es una subclase de Number. Una subclase hereda las variables y los mtodos de su superclase. Crear una subclase puede ser tan sencillo como incluir la clausula extends en su declaracin de clase. Sin embargo, se tendrn que hacer otras provisiones en su cdigo cuando se crea una subclase, como sobreescribir mtodos. Para obtener ms informacin sobre la creacin de subclases, puede ver Subclases, Superclases, y Herencia. Listar los Interfases Implementados por la Clase Cuando se declara una clase, se puede especificar que interfase, si lo hay, est implementado por la clase. Pero, Qu es una interfase? Una interfase declara un conjunto de mtodos y constantes sin especificar su implementacin para ningn mtodo. Cuando una clase exige la implementacin de un interfase, debe proporcionar la implementacin para todos los mtodos declarados en el interfase. Para declarar que una clase implementa uno o ms interfaces, se debe utilizar la palabra clave implements seguida por una lista de los interfaces implementados por la clase delimitados por comas. Por ejemplo, imagina un interfase llamado Aritmtico que define los mtodos llamados suma (), resta (), etc... La clase Numero Imaginario puede declarar que implementa el interfase Aritmtico de esta forma. class NumeroImaginario extends Number implements Aritmtico { ... } se debe garantizar que proporciona la implementacin para los mtodos suma(), resta() y dems mtodos declarados en el interfase Aritmtico. Si en Numero Imaginario falta alguna implementacin de los mtodos definidos en Aritmtico, el compilador mostrar un mensaje de error y no compilar el programa. nothing.java:5: class NumeroImaginario must be declared abstract. It does not define java.lang.Number add(java.lang.Number, java.lang.Number) from interface Aritmetico. class NumeroImaginario extends Number implements Aritmetico {

^ Por convencin, la clausula implements sigue a la clausula extends si sta existe. Observa que las firmas de los mtodos declarados en el interface Aritmetico deben corresponder con las firmas de los mtodos implementados en la clase NumeroImaginario. Tienes ms informacin sobre cmo crear y utilizar interfaces en Crear y Utilizar Interfaces.

Clases Public, Abstract, y Final Se puede utilizar uno de estos tres modificadores en una declaracin de clase para declarar que esa clase es pblica, abstracta o final. Los modificadores van delante de la palabra clave class y son opcionales. El modificador public declara que la clase puede ser utilizada por objetos que estn fuera del paquete actual. Por defecto, una clase slo puede ser utilizada por otras clases del mismo paquete en el que estn declaradas. public class NumeroImaginario extends Number implements Aritmetico { ... } Por convencin, cuando se utiliza la palabra public en una declaracin de clase debemos asegurarnos de que es el primer item de la declaracin. El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta podra contener mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser una superclase y no puede ejemplarizarse. Para una discusin sobre las clases abstractas y cmo escribirlas puedes ver Escribir Clases y Mtodos Abstractos. Utilizando el modificador final se puede declarar que una clase es final, que no puede tener subclases. Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y razones de diseo. Para una mejor explicacin sobre las clases finales puedes ver Escribir Clases y Mtodos Finales. Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una clase que contenga mtodos no implementados no puede ser final. Intentar declarar una clase como final y abstracta resultar en un error en tiempo de compilacin. Sumario de la Declaracin de una Clase En suma, una declaracin de clase se parecera a esto. [ modificadores ] class NombredeClase NombredeSuperclase ] [ extends

[ implements NombredeInterface ] { ... } Los puntos entre [ y ] son opcionales. Una declaracin de clase define los siguientes aspectos de una clase.

modificadores declaran si la clase es abstracta, pblica o final. Nombre de Clase selecciona el nombre de la clase que est declarando Nombre de SuperClase es el nombre de la superclase de NombredeClase Nombre de Interface es una lista delimitada por comas de los interfaces implementados por NombredeClase

De todos estos items, slo la palabra clave class y el nombre de la clase son necesarios. Los otros son opcionales. Si no se realiza ninguna declaracin explcita para los items opcionales, el compilador Java asume ciertos valores por defecto (una subclase de Object no final, no pblica, no obstracta y que no implementa interfaces). 5.1 MODIFICADORES DE ACCESO Modificadores Los modificadores son elementos del lenguaje que se colocan delante de la definicin de variables locales, dato miembro, mtodos o clases y que alteran o condicionan el significado del elemento. En captulos anteriores se ha descrito alguno, como es el modificador static que se usa para definir datos miembros o mtodos como pertenecientes a una clase, en lugar de pertenecer a una instancia. En captulos posteriores se tratarn otros modificadores como final, abstract o synchronized. En este captulo se presentan los modificadores de acceso, que son aquellos que permiten limitar o generalizar el acceso a los componentes de una clase o a la clase en si misma. Modificadores de acceso Los modificadores de acceso permiten al diseador de una clase determinar quien accede a los datos y mtodos miembros de una clase. Los modificadores de acceso preceden a la declaracin de un elemento de la clase (ya sea dato o mtodo), de la siguiente forma: [modificadores] tipo_variable nombre; [modificadores] tipo_devuelto nombre_Metodo ( lista_Argumentos ); Existen los siguientes modificadores de acceso:

public - Todo el mundo puede acceder al elemento. Si es un dato miembro, todo el mundo puede ver el elemento, es decir, usarlo y asignarlo. Si es un mtodo todo el mundo puede invocarlo. private - Slo se puede acceder al elemento desde mtodos de la clase, o slo puede invocarse el mtodo desde otro mtodo de la clase. protected - Se explicar en el captulo dedicado a la herencia. sin modificador - Se puede acceder al elemento desde cualquier clase del package donde se define la clase.

Pueden utilizarse estos modificadores para cualquier tipo de miembros de la clase, incluidos los constructores (con lo que se puede limitar quien puede crear instancias de la clase). En el ejemplo los datos miembros de la clase Punto se declaran como private, y se incluyen mtodos que devuelven las coordenadas del punto. De esta forma el diseador de la clase controla el contenido de los datos que representan la clase e independiza la implementacin de la interface. class Punto { private int x , y ; static private int numPuntos = 0; Punto ( int a , int b ) { x = a ; y = b; numPuntos ++ ; } int getX() { return x; } int getY() { return y; } static int cuantosPuntos() { return numPuntos; } } Si alguien, desde una clase externa a Punto, intenta: ... Punto p = new Punto(0,0); p.x = 5; ... obtendr un error del compilador.

13.3. Modificadores de acceso para clases Las clases en si mismas pueden declararse:

public - Todo el mundo puede usar la clase. Se pueden crear instancias de esa clase, siempre y cuando alguno de sus constructores sea accesible. sin modificador - La clase puede ser usada e instanciada por clases dentro del package donde se define.

Las clases no pueden declararse ni protected , ni private . . Son importantes los modificadores de acceso? Los modificadores de acceso permiten al diseador de clases delimitar la frontera entre lo que es accesible para los usuarios de la clase, lo que es estrictamente privado y 'no importa' a nadie ms que al diseador de la clase e incluso lo que podra llegar a importar a otros diseadores de clases que quisieran alterar, completar o especializar el comportamiento de la clase. Con el uso de estos modificadores se consigue uno de los principios bsicos de la Programacin Orientada a Objetos, que es la encapsulacin: Las clases tienen un comportamiento definido para quienes las usan conformado por los elementos que tienen un acceso pblico, y una implementacin oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios de la clase. Los otros dos modificadores, protected y el acceso por defecto (package) complementan a los otros dos. El primero es muy importante cuando se utilizan relaciones de herencia entre las clases y el segundo establece relaciones de 'confianza' entre clases afines dentro del mismo package. As, la pertenencia de las clases a un mismo package es algo ms que una clasificacin de clases por cuestiones de orden. Cuando se disean clases, es importante pararse a pensar en trminos de quien debe tener acceso a que. Qu cosas son parte de la implantacin y deberan ocultarse (y en que grado) y que cosas forman parte de la interface y deberan ser pblicas. 5.2 ENCAPSULAMIENTO DE LA CLASE Encapsulamiento de Clases Definicin previa: un paquete es una coleccin de clases que se encuentran en el mismo directorio. Las clases permiten implementar tipos de datos abstractos. El problema que se presenta es que desde cualquier clase se puede accesar los campos de un objeto perteneciente a otra clase. Esto es una violacin al

principio de abstraccin que dice que un tipo de datos abstracto slo puede ser manipulado a travs de las operaciones que se definen para ste. Visibilidad de Campos y Mtodos En java al definir una clase se puede controlar la visibilidad que tendrn sus campos y mtodos al exterior de la clase. Este control se efecta de la siguiente forma: class A { private int privx; protected int protb; public int pubc; int paqd; private void MetPriv() { ... } protected void MetProt() { ... } public void MetPub(A a) { // Un campo siempre es visible // en la clase en donde se define ... privx ... a.privx ... ... protb ... a.protb ... ... pubc ... a.pubc ... // Un mtodo siempre es visible // en la clase en donde se define MetPriv(); a.MetPriv(); } void MetPaq() { ... } } Las palabras private, protected y public son atributos de un campo o un mtodo y su significado es el siguiente:

private: El campo o mtodo slo es visible dentro de la clase donde se define. protected: El campo o mtodo es visible en la clase en donde se define y en cualquiera de sus subclases. public: El campo o mtodo es visible en cualquier clase. Ninguna de las anteriores: El campo o mtodo es visible en cualquiera de las clases pertenecientes al paquete en donde se define.

Ejemplo: class B { public void MetB()

{ A a= new A(); a.pubc= 1; // Ok a.priva= 2; // error, privado a.protb= 3; // error, B no es // subclase de A a.MetPub(); // Ok a.MetPriv(); // error, privado } } 5.3 EL METODO COMO ELEMENTO DE LA COMUNICACION Implementan la funcionalidad asociada al objeto. Los mtodos son el equivalente a las funciones en los lenguajes estructurados. Se diferencian de ellos en que es posible acceder a las variables de la clase de forma implcita. Cuando se desea realizar una accin sobre un objeto, se dice que se le manda un mensaje invocando a un mtodo que realizar la accin. Habitualmente, los mtodos suelen ser verbos. 5.3.1 SINTAXIS DEL METODO Las propiedades son un tipo especial de mtodos. Debido a que suele ser comn que las variables miembro sean privadas para controlar el acceso y mantener la coherencia, surge la necesidad de permitir consultar o modificar su valor mediante pares de mtodos: GetVariable y SetVariable. Los lenguajes orientados a objetos ms modernos (por ejemplo Java, C#) aaden la construccin de propiedad que es una sintaxis simplificada para dichos mtodos: 5.3.2 CONCEPTO DE PARAMETRO Un parmetro en C++ es una variable que puede pasar su valor a un procedimiento desde el principal o desde otro procedimiento. Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para que los use en algn proceso. Estos valores que se pasan del cuerpo principal del programa o de un procedimiento a otros procedimientos se llaman parmetros. Entonces la declaracin completa de un procedimiento es: Void Nom_Proc(lista de parmetros) { cuerpo de

instrucciones;}; Donde lista de parametros es una o mas variables separadas por coma, como lo muestra el programa ejemplo. prog12.cpp 1. include <stdio.h> 2. include <conio.h> 3. include <string.h> REGLAS PARA EL USO DE PARAMETROS 1.- Cuando se usan variables como parmetros, la variable que se manda debe ser declarada dentro del principal o del procedimiento de donde se esta enviando. 2.La variable que se manda tiene un nombre, la que se recibe puede tener otro nombre o el mismo nombre por claridad de programa, pero recordar que internamente en la memoria del computador existirn dos variables diferentes. 3.- La cantidad de variables que se envan deben ser igual en cantidad, orden y tipo a las variables que reciben. 4.- La variable que se recibe tiene un mbito local dentro del procedimiento, es decir solo la puede usar ese procedimiento. 5.- Se puede mandar a un procedimiento un dato, una variable (como lo muestran los ejemplos) o una expresin algebraica (no ecuacin o formula, pero siempre se debern recibir en una variable. TAREAS PROGRAMACION C++ 1.- Programa que captura 3 calificaciones en principal, calcular promedio en procedimiento uno e imprimir nombre y promedio en un segundo procedimiento. 2.- Construir una tabla de multiplicar que el usuario indique captura y control de ciclo en principal, clculo y despliegue en un procedimiento. 3.- Construir un procedimiento que reciba un numero entero y que mande llamar a un segundo procedimiento pasando el letrero PAR O IMPAR Parmetro Variables definidas por el usuario para transferir datos a la consulta en el momento de la ejecucin del reporte. Se hace referencia al parmetro en la consulta con su nombre precedido por dos puntos como: nombre _ parmetro. Parmetros Los parmetros se usan para mandar valores a la funcin, con los que ella trabajar para realizar las acciones. Son los valores de entrada que recibe una funcin. Por ejemplo, una funcin que realizase una suma de dos nmeros tendra como parmetros a esos dos nmeros. Los dos nmeros son la entrada, as como la salida sera el resultado. Los parmetros pueden recibir cualquier tipo de datos, numrico, textual, boleano o un objeto. Realmente no especificamos el tipo del parmetro, por eso debemos tener un cuidado especial al definir las acciones que realizamos dentro de la funcin y al pasarle valores a la funcin para

asegurarnos que todo es consecuente con los tipos de nuestras variables o parmetros.

5.3.3 PARAMETROS SALIDA Y ENTRADA METODOS DE ENTRADA/SALIDA A. Introduccin Normalmente, cuando se codifica un programa, se hace con la intencin de que ese programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice cosas y pueda suministrarle datos con los que se quiere que haga algo. Una vez introducidos los datos y las rdenes, se espera que el programa manipule de alguna forma esos datos para proporcionarnos una respuesta a lo solicitado. Adems, en muchas ocasiones interesa que el programa guarde los datos que se le han introducido, de forma que si el programa termina los datos no se pierdan y puedan ser recuperados en una sesin posterior. La forma ms normal de hacer esto es mediante la utilizacin de ficheros que se guardarn en un dispositivo de memoria no voltil (normalmente un disco). A todas estas operaciones, que constituyen un flujo de informacin del programa con el exterior, se les conoce como Entrada/Salida (E/S). Existen dos tipos de E/S; la E/S estndar que se realiza con el terminal del usuario y la E/S a travs de fichero, en la que se trabaja con ficheros de disco. Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estndar de la API de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros. En este tutorial slo se van a dar algunas pinceladas de la potencia de este paquete. B. Entrada/Salida estndar Aqu slo trataremos la entrada/salida que se comunica con el usuario a travs de la pantalla o de la ventana del terminal. Si creamos una applet no se utilizarn normalmente estas funciones, ya que su resultado se mostrar en la ventana del terminal y no en la ventana de la applet. La ventana de la applet es una ventana grfica y para poder realizar una entrada o salida a travs de ella ser necesario utilizar el AWT. El acceso a la entrada y salida estndar es controlado por tres objetos que se crean automticamente al iniciar la aplicacin: System.in, System.out y System.err

a.) System.in Este objeto implementa la entrada estndar (normalmente el teclado). Los mtodos que nos proporciona para controlar la entrada son: read(): Devuelve el carcter que se ha introducido por el teclado leyndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea ledo el siguiente carcter. Si no se ha introducido ningn carcter por el teclado devuelve el valor 1. skip(n): Ignora los n caracteres siguientes de la entrada. b.) System.out Este objeto implementa la salida estndar. Los mtodos que nos proporciona para controlar la salida son: print(a): Imprime a en la salida, donde a puede ser cualquier tipo bsico Java ya que Java hace su conversin automtica a cadena. println(a): Es idntico a print(a) salvo que con println() se imprime un salto de lnea al final de la impresin de a. flush(a): vacia el buffer de salida escribiendo su contenido c.) System.err Este objeto implementa la salida en caso de error. Normalmente esta salida es la pantalla o la ventana del terminal como con System.out, pero puede ser interesante redirigirlo, por ejemplo hacia un fichero, para diferenciar claramente ambos tipos de salidas. 5.3.4 EL CONSTRUCTOR DEFINICIN DE CONSTRUCTORES Y DESTRUCTORES DE UNA CLASE. Definicion: El constructor de una clase es un mtodo estndar para inicializar los objetos de esa clase. Es una funcin que se ejecuta siempre al crear un objeto. Los constructores de una clase tienen siempre el nombre de la clase y no tiene ningn valor devuelto (ni siquiera void). Si el usuario no declara un constructor el sistema (En este caso Java) siempre crea un constructor por defecto sin argumentos. En el momento en el que el usuario define un constructor el constructor del sistema se elimina y es sustituido por el, o los, constructores definidos (al tratarse de un mtodo ms el constructor puede sobrecargarse). Para inicializar un objeto basta con llamar a su constructor despus de la palabra reservada new y asignarlo a una referencia declarada previamente.Un constructor es un mtodo que se ejecuta cada vez que se crea un objeto, el propsito de este procedimiento es el de inicializar los datos del objeto. El nombre del constructor siempre es igual al nombre de la clase. Se invoca automticamente cuando new crea un

objeto de esa clase. Los constructores se declaran en el momento de definir la clase. class A { int x, y; A() { x=0; y=0; } // el constructor } A a= new A(); a.Print(); // 0 0 El constructor puede tener parmetros. En este caso, se deben colocar los argumentos respectivos al crear el objeto: class A { int x, y; A(int ix, int iy) { x=ix; y=iy; } // el constructor } A a= new A(1,2); a.Print(); // 1 2 a= new A(); // error, hay que colocar // los argumentos a.A(1,2); // error, no se puede // invocar el constructor Se pueden colocar varios constructores. Durante la creacin de un objeto, se invoca aquel que calza con los argumentos dados: class A { int x, y; A() { x=0; y= 0; } A(int ix, int iy) { x=ix; y=iy; } A(A from) { x= from.x; y= from.y; } } A a1= new A(); a1.Print(); // 0 0 A a2= new A(1,2); a2.Print(); // 1 2 A a3= new A(a2); a3.Print(); // 1 2

Definicin: Un destructor es un mtodo que se invoca automticamente cuando el objeto se destruye. JAVA no posee destructores, porque tiene recoleccin de basuras. C++ posee destructores. Un destructor es un mtodo que es ejecutado cada vez que se destruye (se elimina de RAM) un objeto, el objetivo de este mtodo es el de eliminar toda la memoria que ocup un objeto. En JAVA no es necesaria la definicin de destructores (es ms no existen), pues el mismo lenguaje se encarga de la eliminacin y liberacin de la memoria ocupada por un objeto, esto se realiza cada vez que un objeto pierde todas sus referencias. En resumen es un mtodo de clase que sirve para realizar ciertas operaciones necesarias al dejar de existir un objeto, por ejemplo, cerrar conexiones de una comunicacin, cerrar ficheros, etc. Java dispone de un elemento denominado recolector de basura (garbage collector) que se encarga de liberar memoria asignada a objetos que ya no se utilizan, an as en ocasiones ser necesario disponer de una funcin que realice operaciones adicionales a la mera liberacin de memoria. Para este fin se crea un mtodo, denominado finalize, con las siguientes caractersticas: protected void finalize() throws throwable { cuerpo del destructor } DEFINICION DE CONSTRUCTOR Constructores Un constructor es una funcin especial que sirve para construir o inicializar objetos. En C++ la inicializacin de objetos no se puede realizar en el momento en que son declarados; sin embargo, tiene una caracterstica muy importante y es disponer de una funcin llamada constructor que permite inicializar objetos en el momento en que se crean. Un constructor es una funcin que sirve para construir un nuevo objeto y asignar valores a sus miembros dato. Se caracteriza por: - Tener el mismo nombre de la clase que inicializa - Puede definirse inline o fuera de la declaracin de la clase - No devuelve valores - Puede admitir parmetros como cualquier otra funcin - Puede existir ms de un constructor, e incluso no existir Si no se define ningn constructor de una clase, el compilador generar un constructor por defecto. El constructor por defecto no tiene argumentos y simplemente sita ceros en cada byte de las variables

instancia de un objeto. Si se definen constructores para una clase, el constructor por defecto no se genera. Un constructor del objeto se llama cuando se crea el objeto implcitamente: nunca se llama explcitamente a las funciones constructoras. Esto significa que se llama cuando se ejecuta la declaracin del objeto. Tambin, para objetos locales, el constructor se llama cada vez que la declaracin del objeto se encuentra. En objetos globales, el constructor se llama cuando se arranca el programa. El constructor por defecto es un constructor que no acepta argumentos. Se llama cuando se define una instancia pero no se especifica un valor inicial. Se pueden declarar en una clase constructores mltiples, mientras tomen parte diferentes tipos o nmero de argumentos. El compilador es entonces capaz de determinar automticamente a qu constructor llamar en cada caso, examinando los argumentos. Los argumentos por defecto se pueden especificar en la declaracin del constructor. Los miembros dato se inicializarn a esos valores por defecto, si ningn otro se especifica. C++ ofrece un mecanismo alternativo para pasar valores de parmetros a miembros dato. Este mecanismo consiste en inicializar miembros dato con parmetros. class prueba { tipo1 d1; tipo2 d2; tipo3 d3; public: prueba(tipo1 p1, tipo2 p2, tipo3 p3):d1(p1),d2(p2),d3(p3) { } }; Un constructor que crea un nuevo objeto a partir de uno existente se llama constructor copiador o de copias. El constructor de copias tiene slo un argumento: una referencia constante a un objeto de la misma clase. Un constructor copiador de una clase complejo es: complejo::complejo(const complejo &fuente) { real=fuente.real;imag=fuente.imag; } Si no se incluye un constructor de copia, el compilador crear un constructor de copia por defecto. Este sistema funciona de un modo perfectamente satisfactorio en la mayora de los casos, aunque en ocasiones puede producir dificultades. El constructor de copia por defecto inicializa cada elemento de datos del objeto a la izquierda del operador = al valor del elmento dato equivalente del objeto de la derecha del operador =. Cuando no hay punteros invicados, eso funciona bien. Sin embargo, cuando se utilizan punteros, el constructor de copia por defecto inicializar el valor de un elemento puntero de la izquierda del operador = al del elemento equivalente de la derecha del operador; es decir que los dos punteros apuntan en la misma direccin. Si sta no es la situacin que se desea, hay que escribir un constructor de copia.

5.3.5 EL DESTRUCTOR Un destructor es una funcin miembro con igual nombre que la clase, pero precedido por el carcter ~. Una clase slo tiene una funcin destructor que, no tiene argumentos y no devuelve ningn tipo. Un destructor realiza la operacin opuesta de un constructor, limpiando el almacenamiento asignado a los objetos cuando se crean. C++ permite slo un destructor por clase. El compilador llama automticamente a un destructor del objeto cuando el objeto sale fuera del mbito. Si un destructor no se define en una clase, se crear por defecto un destructor que no hace nada. Normalmente los destructores se declaran public. Creacin y supresin dinmica de objetos Los operadores new y delete se pueden utilizar para crear y destruir objetos de una clase, as como dentro de funciones constructoras y destructoras. Un objeto de una determinada clase se crea cuando la ejecucin del programa entra en el mbito en que est definida y se destruye cuando se llega al final del mbito. Esto es vlido tanto para objetos globales como locales, ya que los objetos globales se crean al comenzar el programa y se destruyen al salir de l. Sin embargo, se puede crear un objeto tambin mediante el operador new, que asigna la memoria necesaria para alojar el objeto y devuelve su direccin, en forma de puntero, al objeto en cuestin. Los constructores normalmente implican la aplicacin de new. p =new int(9) //p es un puntero a int inicializado a 9 cadena cad1(hola); cadena *cad2=new cadena; Un objeto creado con new no tiene mbito, es decir, no se destruye automticamente al salir fuera del mbito, sino que existe hasta que se destruye explcitamente mediante el operador delete. class cadena { char *datos; public:cadena(int); ~cadena(); }; cadena::cadena(int lon) { datos=new char[lon]; } cadena::~cadena() { delete datos; }

También podría gustarte