Professional Documents
Culture Documents
)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.
/
)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
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
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
$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.
>
-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.
-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
$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.
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];
11