You are on page 1of 12

Dcimosexta Sesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Creacin Dinmica de Objetos


1

16.1 Creacin Dinmica de Objetos


Repaso de obrecarga de Operadores +! ++! "#! ()! int() Podemos sobrecargar la suma de Complejo de forma general a travs de una funcin o en particular como un mtodo. Operadores binarios: Uno de los argumentos so !"o mismo#. Operadores unitarios: $l argumento so !"o mismo#. %cordaos de la diferencia entre prefijo sufijo &''i i''(

)a completa ra*on para la e+istencia de la sobrecarga de operadores es para a$%ellas sit%aciones en $%e nos simpli&ca la 'ida. )os operadores sobrecargados son solo (%nciones con nombres di'ertidos, las llamadas a funcion son llamadas por el compilador cuando se satisface el patrn adecuado. -i la sobrecarga de operadores no proporciona un bene&cio signi&cati'o para el creador de la clase o para el %s%ario de la clase, no compli.uemos el asunto anadindolo.
/

16.2 Creacin Dinmica de Objetos


Creacin de Objetos

)a creacin de un objeto en C'' tiene lugar en dos pasos: 1.0 %signacin de 1emoria para el objeto. /.0 )lamada al constructor.
%ceptemos por a2ora .ue este segundo paso ocurre siempre. C'' lo fuer*a, debido a .ue el uso de objetos no iniciali*ados es una de las causas ms frecuentes de errores de programacion. -iempre se invoca al constructor, sin importar cmo ni dnde se crea el objeto.
3

16.2 Creacin Dinmica de Objetos


Creacin de Objetos) *signacin de Memoria Puede ocurrir de varios modos en diferente momento:

1.0 %signacin de memoria en la *ona de almacenamiento esttico, .ue tiene lugar durante la carga del programa. $l espacio de memoria asignado al objeto e+iste 2asta .ue el programa termina. /.0 %signacin de memoria en la pila, cuando se alcan*a algun punto determinado durante la ejecucin del programa &la llave de apertura de un blo.ue(.)a memoria asignada se vuelve a liberar en el punto de ejecucion complementario &la llave de cierre(. $s necesario saber cuantas variables se necesitan mientras se escribe el programa de modo .ue el compilador pueda generar el cdigo correspondiente. 3 %signancin dinmica, en una *ona de memoria libre llamada 2eap o free store. -e reserva espacio para un objeto en esta *ona mediante la llamada a una funcion durante la ejecucin del programa. -e puede decidir en cual.uier momento .ue se necesita cierta cantidad de memoria. $st fuera de las reglas de mbito. 4a .ue decidir cundo se libera.
5

16.2 Creacin Dinmica de Objetos


Operador ne+ Cuando se crea un objeto mediante el operador ne+, ste se encarga de obtener el espacio necesario para el objeto de llamar a su constructor.
TipoNuestro *ptn = new TipoNuestro(1,2);

Primero asigna espacio, comprueba .ue se 2a a recuperado correctamente utli*ando el puntero t,is, 2ace la llamada al constructor adecuado. $n las e+presiones con ne6 se puede usar cual.uiera de los constructores disponibles para una clase. -i ste no tiene argumentos, se escribe la e+presin sin lista de argumentos
TipoNuestro *ptn = new TipoNuestro;

)a creacin dinmica de objetos es mu simple: una 7nica e+presion reali*a todo el trabajo de clculo de tama8o, asignacin, comprobaciones de seguridad conversion de tipo. )a creacion dinmica de objetos es casi tan sencilla como la creacion en la pila.
9

16.2 Creacin Dinmica de Objetos


Operador delete Delete primero llama al destructor despus libera la memoria. $) argumento para delete debe ser una direccin: Puntero a objeto creado con ne6:
delete ptn;

$l uso del operador delete debe reservarse solo para los objetos .ue 2a an sido creados mediante ne6. :o ocurre nada si el puntero .ue se le pasa a delete es nulo. Por esa ra*n, a menudo se recomienda asignar cero al puntero inmediatamente despus de usar delete; se evita as< .ue pueda ser usado de nuevo como argumento para delete. =ratar de destruir un objeto ms de una ve* es un error de consecuencias imprevisibles.
>

16.2 Creacin Dinmica de Objetos


-estin de Memoria $l compilador conoce con e+actitud el tipo, la cantidad objetos automticos .ue se crean en la pila. $l espacio asignado a los objetos cdigo .ue genera. el mbito de los

su duracin .ueda bien de?nido en el

-e re.uiere ma or gasto tanto en tiempo como en espacio para la creacion dinmica de objetos. 4a .ue buscar un 2ueco en la memoria .ue est disponible para el objeto .ue estamos creando.

16.2 Creacin Dinmica de Objetos


.elete 'oid/ ) Mal as%nto
class Objecto { void* datos_; const int tam_; const char id_; public: Objeto(int a, char c): tam_(a), id_(c) { datos_ = new char[tam_]; cout<<Constructor de<< id_; } ~Objeto() { cout<<DEStructor de<< id_; delete [] datos_; //OK Simple } }; Como resultado obtenemos un programa con una silenciosa fuga de memoria!! INICIO SALIDA POR PANTALLA Constructor de a DEStrcutor de a Constructor de b FIN } int main() { Objecto* a = new Objeto(40, a); delete a; void* b = new Objeto(40, b); delete b;

16.2 Creacin Dinmica de Objetos


Operadores ne+ y delete con arrays $n C'' se pueden crear vectores de objetos a sea en la pila o en el 2eap, con la certe*a de .ue se producir la llamada al constructor para cada uno de los objetos del vector. 4a una restriccin: debe e+istir un constructor por defecto, o sea, sin argumentos, .ue es el .ue ser llamado para cada objeto.
TipoNuestro *ptn = new TipoNuestro; TipoNuestro *pa = new TipoNuestro[100];

-e asigna espacio suficiente para 1BB objetos del tipo adecuado uno a uno a sus constructores.

se llama

Pero ptn pa son iguales para alguien .ue no 2a a visto estas sentencias CnoD. :osotros sabemos .ue paE3F tiene sentido .ue ptnE5BF no lo tiene.
G

16.2 Creacin Dinmica de Objetos


Operadores ne+ y delete con arrays
delete ptn; // Correcto delete pa; // No obtenemos el resultado deseado

$n el segundo caso ocurre lo mismo .ue en el primero: -e llama al destructor del elemento apuntado. $n el segundo caso nos estamos olvidando de llamar a los destrcutores de GG objetos. -in embargo, s< se liberar toda la memoria asignada al vector, a .ue fue obtenida como un 7nico gran blo.ue cu o tama8o .ued anotado en alguna parte por las rutinas de asignacin.
delete ptn; delete [] pa; // Correcto // Correcto

)os corc2etes indican al compilador la necesidad de generar el codigo para obtener el numero de objetos en el vector, .ue fue guardado en alguna parte cuando se cre, llamar al destructor para cada uno de dic2os 1B elementos.

16.2 Creacin Dinmica de Objetos


0Cmo ,acer $%e %n p%ntero se comporte como %n array1
TipoNuestro *pa = new TipoNuestro[100];

Huiero .ue !pa sea como si 2ubiera creado un arra de forma esttica. $s decir no .uiero .ue se utilice para apuntar o otras cosas. =ampoco .uiero .ue se utilice con, por ejemplo, ''.
const TipoNuestro *pa = new TipoNuestro[100]; TipoNuestro * const pa = new TipoNuestro[100];

CHu opcin es la !buena#D

11

16.2 Creacin Dinmica de Objetos


obrecarga de los operadores ne+ y delete Cuando se ejecuta una e+presin con ne6, ocurren dos cosas. Primero se asigna la memoria al ejecutar el cdigo del operator ne6&( despus se reali*a la llamada al constructor. $n el caso de una e+presin con delete, se llama primero al destructor despus se libera la memoria con el operador operator delete&(. )as llamadas al constructor destructor no estn bajo el control del programador pero se pueden cambiar las funciones opertator ne6&( operatator delete&(. Irecuentemente la ra*on para cambiar el asignador es la e?ciencia; puede ser .ue se necesite crear destruir tantos objetos de la misma clase .ue lo 2aga ine?ca* en trminos de velocidad: un cuello de botella. $n C'' es posible sobrecargar ne6 local a una clase. delete de forma global de forma
1/

You might also like