You are on page 1of 5

15/10/2015

Conoce300::PascalconFreePascal::IntroduccinalaprogramacinorientadaaobjetosI::ConstructoresyDestructores

LENGUAJESDEPROGRAMACIN

PASCALCONFREEPASCAL
Trabajo:ArcaContinental

Accedeasusofertasdeempleo.
Checalasvacantesypostlate.

10.IntroduccinalaprogramacinorientadaaobjetosI.

10.3.ConstructoresyDestructores.

anterior::indice::siguiente

10.1.QueslaprogramacinOrientadaa
10.5.HerenciaPolimorfismoporsobreescritura
10.8.Parametrosopcionalesyusodeself.
Objetos?.
Compatibilidadentreobjetos.
10.9.Preguntasyejercicios.
10.2.Unprogramadeejemplo.
10.6.Encapsulacin(Private,Strictprivate,
10.10.Respuestaalaspreguntasyejercicios.
10.3.ConstructoresyDestructores.
Protected,StrictProtected,Public).

10.4.SobrecargademtodosPolimorfismopor
10.7.Polimorfismoporsobreescrituraconenlace
sobrecarga.
posterior.

Losconstructoressonlosmtodosqueseencargandecrearunobjetoenelmontculo,ylosdestructoressonlosmtodosquese
encargan de retirarlos del montculo. Al momento de crear un objeto de una determinada clase, para ejecutar el constructor
correspondiente, se hace referencia con la clase y no con el objeto que se quiere crear. Esto debido a que el constructor es el
encargado de crear el objeto en el montculo. Todas las clases tienen un constructor predefinido llamado Create, este como ya
expliqueseencargadecrearelobjetoenelmontculo,perotambinseencargadeinicializartodoslosatributos automticamente
conceros.Deestemodosilosatributossonnmerosenterosorealestendrnelvalor0,sisondeltipobooleantendrnelvalor
false,siesunacadenadecaracterestendrunacadenadecaracteresvaca,siesuncarctertendrelcarcternulo,siesde
tipoenumeradotendrelvalorinicial,siempreycuandonosehayacambiadolaenumeracindelostiposenumerados(esdecir
siempredebencomenzarencero),yenelcasodelosconjuntostendrnunconjuntovaci.
Cadavezquesecreaunobjeto,esprecisodestruirlo.Sinosehace,lamemoriautilizadaenelmontculoporelobjetonoestar
disponibleparaotroobjeto,hastaquesefinaliceelprograma.
Nuestras clases, pueden tener sus propios constructores, para ello se hace uso de la palabra reservada constructor. La
declaracindeunconstructorsehacedespusdelosatributosdeunaclase,encasocontrarioelcompiladorgenerarunerrorde
compilacin. Un constructor tambin se puede utilizar para iniciar los atributos a un determinado valor, por ejemplo, a la clase
TComplejos se le puede aadir un constructor para crear un nmero complejo con sus valores real e imaginario, sin usar los
mtodosPonRealyPonImag.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
UNITComplejos;
INTERFACE
TYPE
TComplejo=CLASS
ParteReal,ParteImag:double;
CONSTRUCTORCrear(r,i:double);
FUNCTIONObtReal:double;
FUNCTIONObtImag:double;
PROCEDUREPonReal(n:double);
PROCEDUREPonImag(n:double);
FUNCTIONObtCad(dec:integer):string;
FUNCTIONPonCad(n:string):integer;
PROCEDUREAdicion(n:TComplejo);
PROCEDUREMultiplicacion(n:TComplejo);
END;
IMPLEMENTATION
CONSTRUCTORTComplejo.Crear(r,i:double);
BEGIN
ParteReal:=r;
ParteImag:=i;
END;

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php

1/5

15/10/2015

Conoce300::PascalconFreePascal::IntroduccinalaprogramacinorientadaaobjetosI::ConstructoresyDestructores
FUNCTIONTComplejo.ObtReal:double;
BEGIN
ObtReal:=ParteReal
END;
FUNCTIONTComplejo.ObtImag:double;
BEGIN
ObtImag:=ParteImag
END;
PROCEDURETComplejo.PonReal(n:double);
BEGIN
ParteReal:=n;
END;
PROCEDURETComplejo.PonImag(n:double);
BEGIN
ParteImag:=n
END;
FUNCTIONTComplejo.ObtCad(dec:integer):string;
VARaux1,aux2,p:string;
BEGIN
p:='';
Str(ParteReal:0:dec,aux1);
Str(ParteImag:0:dec,aux2);
IFParteImag>=0THENp:='+';
ObtCad:=aux1+p+aux2+'i';
END;

FUNCTIONTComplejo.PonCad(n:string):integer;
VARaux:string;
p,i,error:integer;
PR,PI:string;
encontro:boolean;
BEGIN
aux:=n;
ParteReal:=0;
ParteImag:=0;
error:=0;
IF(aux[length(aux)]='i')AND(NOT(aux[length(aux)1]IN['0'..'9']))
THENaux:=Copy(aux,1,length(aux)1)+'1i';
IFaux[length(aux)]='i'THEN
BEGIN
delete(aux,length(aux),1);
IFaux[length(aux)]IN['0'..'9']
THENBEGIN
i:=length(aux);
encontro:=FALSE;
p:=0;
WHILE(NOTencontro)AND(i>1)DO
BEGIN
IF(aux[i]='+')OR(aux[i]='')
THENBEGIN
encontro:=TRUE;
p:=i
END;
i:=i1
END;
PR:=Copy(aux,1,p1);
delete(aux,1,p1);
PI:=aux;
Val(PR,ParteReal,error);
Val(PI,ParteImag,error);
IFerror<>0THEN
BEGIN
ParteReal:=0;
ParteImag:=0
END
END;
END
ELSE
BEGIN
Val(aux,ParteReal,error);
END;
PonCad:=error
END;
PROCEDURETComplejo.Adicion(n:TComplejo);
BEGIN
PonReal(ObtReal+n.ObtReal);
PonImag(ObtImag+n.ObtImag)
END;
PROCEDURETComplejo.Multiplicacion(n:TComplejo);
VARPR,PI:double;
BEGIN
PR:=(ObtReal*n.ObtReal)(ObtImag*n.ObtImag);
PI:=(ObtReal*n.ObtImag)+(ObtImag*n.ObtReal);
PonReal(PR);
PonImag(PI)
END;
END.

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php

2/5

15/10/2015

Conoce300::PascalconFreePascal::IntroduccinalaprogramacinorientadaaobjetosI::ConstructoresyDestructores

Cdigofuente3:UnidadComplejosconelconstructorCrear.

AhoraelprogramaSumMul.pp,slousarlosconstructoresparacrearlosnmeroscomplejos.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
USESComplejos;
VARNumero01,Numero02,Resultado:TComplejo;
BEGIN
Numero01:=TComplejo.Crear(3,5);
Numero02:=TComplejo.Crear(5,2);
Resultado:=TComplejo.Create;

Resultado.Crear(Numero01.ObtReal,Numero01.ObtImag);
Resultado.Adicion(Numero02);
Writeln(Resultado.ObtCad(0));

Resultado.Crear(Numero01.ObtReal,Numero01.ObtImag);
Resultado.Multiplicacion(Numero02);
Writeln(Resultado.ObtCad(0))
END.

Cdigofuente4:ProgramaSumMulusandoelconstructorcrear.

Cmo se puede observar en el programa SumMul.pp, el objeto Resultado usa el constructor crear, para colocar la parte real e
imaginariadelprimernmerocomplejo,antesdesumarloomultiplicarlo.Tambinsepuedeutilizarelconstructorsobreunobjeto
yacreadoenesecasonosecreaunobjetoenelmontculo,puesyaexiste,perosinembragoseejecutanlasinstrucciones del
constructor.Esdecir,simsadelanteenelprogramaSumMul.pp,hacemoslosiguiente:

Numero01:=TComplejo.Crear(3,5)
..
...
Numero01.Crear(8,5)

Numero01,tendrelnmerocomplejo8+5i,ynoconelquesehacreado3+5i.Hayquetenercuidadoconelusodeestatcnica,
ya que si el objeto no ha sido creado, se produce un error en tiempo de ejecucin. Es decir si no se hubiese creado el objeto
Numero01,yseejecutanlassiguientesinstrucciones:

Numero01.Crear(8,5)
Writeln(Numero01.ObtCad(0))

Seproducirunerrorentiempodeejecucin,porelusodelmtodoObtCad,quehacereferenciaaunobjetoquenosehacreado.
TodaslasclasestambintienenundestructorpredefinidollamadoDestroy. Para la implementacin de un destructor propio para
unaclase,seprocededemodosimilaralaimplementacindelosconstructores,exceptoquelapalabrareservadaconstructorse
sustituye por la palabra reservada destructor, pero en una clase slo debe haber un destructor y este no debe tener parmetros.
Lasinstruccionesdefinidaseneldestructorseejecutanjustoantesdeliberarlamemoriausadaporelobjeto.
El uso de los destructores depender de las circunstancias del programa, en el programa SumMul, en ningn momento se
destruyen los objetos Numero01, Numero02 y resultado, ya que no es necesario, debido a la naturaleza del programa que es
secuencial.Esdecirtodoobjetoquesecreeenunprogramaserdestruidocuandoelprogramafinalice.
Peroexistencircunstanciasenlaqueesnecesariodestruirelobjeto,paraqueestenoocupeespaciodememoriaenelmontculo.
A modo de ejemplo he creado el siguiente programa, en donde se hace uso de un procedimiento que permite intercambiar dos
nmeros complejos. El procedimiento usa un objeto aux, de la clase de TComplejo, que se crea dentro del procedimiento. La
variableauxalserunpuntero,contieneunadireccindememoriaalobjetoquesecreaenelmontculo,cuandoelprocedimiento
termina, la variable aux se borra de la pila, y si el objeto no es destruido entonces este existir de manera inaccesible en el
montculo,ocupandoespacioquesepuedeaprovecharporotroobjeto.Esenestacircunstanciacuandoesnecesarioeliminarel
objeto.Acontinuacinelprogramadeejemplo,estehaceusodelaunidadComplejos.pp.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
USESComplejos;
VARA,B:TComplejo;

PROCEDUREIntercambio(A,B:TComplejo);
VARaux:TComplejo;
BEGIN
aux:=TComplejo.crear(A.ObtReal,A.ObtImag);
A.crear(B.ObtReal,B.ObtImag);
B.crear(aux.ObtReal,aux.ObtImag);
aux.destroy;
aux:=NIL;
END;
BEGIN
A:=TComplejo.Crear(10,4);
B:=TComplejo.Crear(0,1);
Writeln('A=',A.ObtCad(0));
Writeln('B=',B.ObtCad(0));
Intercambio(A,B);
Writeln('A=',A.ObtCad(0));
Writeln('B=',B.ObtCad(0))

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php

3/5

15/10/2015

Conoce300::PascalconFreePascal::IntroduccinalaprogramacinorientadaaobjetosI::ConstructoresyDestructores
END.

Cdigofuente5:Usodedestroy.

Despusdellamaraldestructorserecomiendaponeranillavariableaux,paraindicarqueelobjetosehaeliminado.Enestecaso
noesnecesarioperoesbuenomantenerestaprctica.
Cuandounprogramaesdemasiadocomplejo,suelesucedersituacionesenlaquenosepuedesaberanticipadamentesiunobjeto
ha sido destruido en otra parte del cdigo, con lo que puede suceder que se ejecute el mtodo destroy por segunda vez
ocasionandounerrorentiempodeejecucin.Porloqueserecomiendaenvezdeusareldestructordestroy,usarelmtodofree,
queesunmtodo,quepordefectolotienentodaslasclasesenfreepascal.Estemtodoseencargadeverificarsirealmentese
elimino el objeto del montculo, comprobando si el objeto tiene el valor nil, en caso no se haya eliminado entonces este mtodo
ejecutar el destructor destroy, eliminando al objeto del montculo. Despus de usar free, se debe colocar el objeto a nil, para
indicar que este se ha eliminado y de ese modo cuando en otra parte del cdigo se vuelve a usar otra vez el mtodo free, este
evitarusareldestructordelobjetoqueyasehadestruido.Ejemplo:

{$codepageutf8}
{$modeobjfpc}
USESComplejos;
VARA,B:TComplejo;

PROCEDUREIntercambio(A,B:TComplejo);
VARaux:TComplejo;
BEGIN
aux:=TComplejo.crear(A.ObtReal,A.ObtImag);
A.crear(B.ObtReal,B.ObtImag);
B.crear(aux.ObtReal,aux.ObtImag);
aux.free;
aux:=NIL;
END;
BEGIN
A:=TComplejo.Crear(10,4);
B:=TComplejo.Crear(0,1);
Writeln('A=',A.ObtCad(0));
Writeln('B=',B.ObtCad(0));
Intercambio(A,B);
Writeln('A=',A.ObtCad(0));
Writeln('B=',B.ObtCad(0))
END.

Cdigofuente6:Usodefree.

Aunquesepuedencreardestructoresconunnombrepropioomejordichodiferenteadestroy,noesrecomendablehacerlosise
usaelmtodofree,yaqueesteejecutaeldestructorquetienencomonombredestroyynoejecutareldefinidoporelusuario.

ltimarevisin:16/06/2013.

Recomendar

Tweet

anterior::indice::siguiente

SUGERENCIAS

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php

4/5

15/10/2015

Conoce300::PascalconFreePascal::IntroduccinalaprogramacinorientadaaobjetosI::ConstructoresyDestructores
"Agradezco que se tomen su tiempo, para escribirme una sugerencia. Toda sugerencia que me
escribameayudaamejorarloscontenidosdelawebacordeasusnecesidades.Lassugerencias,se
recibirn siempre y cuando ingrese al menos su nombre o seudnimo y la sugerencia. Las
sugerenciassondeusointernoynosernpublicadasenlawebConoce3000"

Nombreoseudnimo

CorreoElectrnico

Sugerencias

Deseorecibirunacopiadelmensaje.

Enviar

PORTADA| LIBROS| APUNTES| ARTCULOS

Todoslostextos,imgenesyvideosdeConoce3000estancolocadosbajounalicencia:
CreativeCommonsReconocimientoNoComercial3.0UnportedLicense.

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php

5/5

You might also like