Vous êtes sur la page 1sur 60

Memoria en C++

Punteros - Referencias
Clases
Y ahora, a trabajar!

Memoria Dinamica en C++

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Que es una variable?

Matematica: una etiqueta que representa a un valor en una


expresion: f (y ) = y 2 + 2y
Programacion: Nombre simb
olico dado a un valor residente en
la memoria.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Propiedades basicas

int x = 0;
x += 1 0 ;
x++;

// e q u i v a l e a x=x +10;
// e q u i v a l e a x=x +1;

Nombre: x

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Propiedades basicas

int x = 0;
x += 1 0 ;
x++;

// e q u i v a l e a x=x +10;
// e q u i v a l e a x=x +1;

Nombre: x
Tipo: int

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Propiedades basicas

int x = 0;
x += 1 0 ;
x++;

// e q u i v a l e a x=x +10;
// e q u i v a l e a x=x +1;

Nombre: x
Tipo: int
Valor: para este ejemplo, 11

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Propiedades basicas

int x = 0;
x += 1 0 ;
x++;

// e q u i v a l e a x=x +10;
// e q u i v a l e a x=x +1;

Nombre: x
Tipo: int
Valor: para este ejemplo, 11
Su ubicacion en la memoria (?)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Tiempo de vida de una variable

Toda variable tiene un tiempo de vida, comienza cuando se


declara y finaliza cuando se sale del scope que la declaro.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Tiempo de vida de una variable

Toda variable tiene un tiempo de vida, comienza cuando se


declara y finaliza cuando se sale del scope que la declaro.
int h = 4;
f o r ( i n t i =0; i <10; i ++){
h = 25;
}
c o u t << h << e n d l ;

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Tiempo de vida de una variable

Toda variable tiene un tiempo de vida, comienza cuando se


declara y finaliza cuando se sale del scope que la declaro.
int h = 4;
f o r ( i n t i =0; i <10; i ++){
int g = 75;
}
c o u t << g << e n d l ; // e s t o e s t a b i e n ??

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Tiempo de vida de una variable


Toda variable tiene un tiempo de vida, comienza cuando se
declara y finaliza cuando se sale del scope que la declaro.
int h = 4;
f o r ( i n t i =0; i <10; i ++){
double h = 2 9 ; // c o m p i l a ??
}
c o u t << h << e n d l ;

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Tiempo de vida de una variable


Toda variable tiene un tiempo de vida, comienza cuando se
declara y finaliza cuando se sale del scope que la declaro.
int h = 4;
f o r ( i n t i =0; i <10; i ++){
double h = 2 9 ; // c o m p i l a ??
}
c o u t << h << e n d l ;
El compilador se encarga de usar la pila que el SO provee para
almacenar las variables locales (y a veces los parametros de
funciones)
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Variables en la pila (1/5)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Variables en la pila (2/5)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Variables en la pila (3/5)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Variables en la pila (4/5)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Variables en la pila (5/5)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Modelo de memoria: Abstrayendo

Para C++, la memoria es simplemente un array de bytes


Cada variable ocupa una o mas posiciones del array seg
un su
tama
no
El tama
no depende del tipo, del compilador, y de la
arquitectura

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Variables
Memoria

Veamos un mapa

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Punteros

Dado el tipo T, el tipo T* se denomina puntero a T


Valor (numerico): una direcci
on de memoria
El valor de memoria 0 (NULL) esta reservado como
invalido
Su tipo nos dice a que tipo de objeto apunta
Se puede tener T**, T***, . . . (puntero a puntero a T,
puntero a puntero a puntero a T,. . . )

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Repitan conmigo: FLECHAS

Un puntero se ve mas claramente como una flecha ( ) que


apunta a un objeto en alg
un lugar de la memoria
Varios punteros pueden apuntar a lo mismo (no borres mas
de una vez lo mismo!!)
Un puntero declarado y no inicializado apunta a cualquier
cosa (peligro!)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Veo los punteros!

pos: 777

1234

1101

777
int * p

pos: 1101

int **q

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Operando con punteros


new T : devuelve un T* apuntando a un nuevo objeto de tipo
T
new T [N]: devuelve un T* apuntando a un array de N
elementos de tipo T
p[i]: devuelve el iesimo elemento de un array creado
dinamicamente con new T[N]
delete p / delete [] p: borra lo que esta siendo apuntado por
el puntero p (solo si lo que apunta fue creado con new!).
delete[] borra arrays dinamicos. No confundirlos!!!
*p: devuelve el valor apuntado por p
p(...): equivalente a (*p).(...). Para usar con
clases/structs.
&v: Inverso de *. Sea v de tipo T, &v es un T* con la
direccion de memoria donde se aloja v
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Ejemplos
// p : en e l s t a c k , pk l o va a a p u n t a r
void f u n c A b u r r i d a ( ) {
long k = 1 2 3 4 ;
long pk ;
// pk > ???
pk = &k ;
// pk > k
c o u t << k << == << pk << == << &k e n d l ;
pk = new long ;
// nuevo l o n g en heap
pk = 1 0 ;
( pk)++;
// e s e l o n g a h o r a v a l e 11
d e l e t e pk ;
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Ejemplos (2)

void funcMasAburrida ( ) {
s t r u c t punto { i n t x ; i n t y ; } ;
punto p = new punto ;
c o u t << p>x << == ( p ) . x << e n d l ;
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Referencias

Punteros disfrazados de corderos (igual son preferibles)


Dado el tipo T, T& es una referencia a un objeto de tipo T
Tambien flecha, pero que se usa exactamente igual que el
objeto original
Mas seguros: la direcci
on de memoria esta escondida
Una referencia debe inicializarse con un objeto existente al
declararse (o no compila): no pueden haber referencias
apuntando a algo invalido o a NULL (pero recordemos que se
implementan con punteros...)

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Punteros
Referencias

Ejemplos (2)
void funcMortalmenteAburrida ( ) {
int olerante = 10;
int & loco = olerante ;
i n t & e r r o r D e C o m p i l a c i o n ; //No i n i c i a l i z a d o !
o l e r a n t e += 1 0 ;
l o c o += 1 0 ; // e s una r e f , p e r o s e u s a i g u a l
// c u a n t o v a l e n a h o r a ?
}
long & f u n c M o r t a l ( ) {
long a n i z a = 1 0 ;
return aniza ;
// boom . . . p o r que ?
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Veremos...

El const
Constructor por defecto
Constructor por copia
Listas de inicializaci
on
Operador de asignaci
on
Destructor

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Veremos...

El const
Constructor por defecto
Constructor por copia
Listas de inicializaci
on
Operador de asignaci
on
Destructor
Pero primero, un poco de motivaci
on

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Estructuras, para que


Una rapida muestra de por que tantos punteros.
Estructuras de datos interesantes (pero simples)
Por ejemplo: Si queremos una lista de tama
no dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
C
omo hacemos?

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Estructuras, para que


Una rapida muestra de por que tantos punteros.
Estructuras de datos interesantes (pero simples)
Por ejemplo: Si queremos una lista de tama
no dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
C
omo hacemos?
Representacion: cadena de nodos de longitud variable. Sin
usar memoria dinamica no alcanza. . . por que?

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Estructuras, para que


Una rapida muestra de por que tantos punteros.
Estructuras de datos interesantes (pero simples)
Por ejemplo: Si queremos una lista de tama
no dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
C
omo hacemos?
Representacion: cadena de nodos de longitud variable. Sin
usar memoria dinamica no alcanza. . . por que?
Sin eso no podemos crear mas cosas que las que declaramos
como variables.
y sin punteros son imposibles los tipos de datos recursivos
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Ejemplo estructuras

Listas simple y doblemente encadenadas. C


omo es una lista
vaca? Como se hace para agregar adelante? y atras?
En la lista podriamos tener puntero al primero, al u
ltimo, la
longitud (?), etc.
Por que es indispensable la memoria dinamica? (Concretamente)
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const!
El const se usa para indicar que...
una variable local o de clase es una constante;
un parametro pasado por referencia es de s
olo lectura para
esa funcion/metodo de clase;
un metodo de clase no modifica a la instancia sobre la cual es
llamado (solo lectura de nuevo);
un valor de retorno devuelto por referencia es de solo
lectura para el llamador de una funci
on/metodo de clase.
El const es una manera de especificar el comportamiento del
codigo con respecto a la lectura/escritura de valores. Conviene
usarlo porque el compilador nos va a alertar de algunos errores
comunes.
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const y punteros

No es lo mismo un gato montes...


Los tipos const T * y T const * se leen como puntero a un
T constante. El que es de s
olo lectura es el T apuntado.
El tipo T * const se lee como puntero constante a un T. El
que es de solo lectura es el puntero.
El tipo T const * const (auxilio!) se lee como puntero
constante a un T constante. Aca son de s
olo lectura el
puntero y el apuntado.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const y punteros

No es lo mismo un gato montes...


Los tipos const T * y T const * se leen como puntero a un
T constante. El que es de s
olo lectura es el T apuntado.
El tipo T * const se lee como puntero constante a un T. El
que es de solo lectura es el puntero.
El tipo T const * const (auxilio!) se lee como puntero
constante a un T constante. Aca son de s
olo lectura el
puntero y el apuntado.
... que un const gato montes. T y const T no son lo mismo!!!

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const - conversiones

Cosas del tipo T se pueden usar en lugares donde es necesario


algo del tipo const T (el compilador hace la conversion)...

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const - conversiones

Cosas del tipo T se pueden usar en lugares donde es necesario


algo del tipo const T (el compilador hace la conversion)...
... pero cosas del tipo const T no se pueden usar en lugares
donde es necesario algo del tipo T! Se les ocurre por que?

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const - conversiones

Cosas del tipo T se pueden usar en lugares donde es necesario


algo del tipo const T (el compilador hace la conversion)...
... pero cosas del tipo const T no se pueden usar en lugares
donde es necesario algo del tipo T! Se les ocurre por que?
const T es mas restrictivo que T. El compilador no va a hacer
la conversion de const T a T porque es inseguro (estara
convirtiendo algo de solo lectura en algo escribible).

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

const - ejemplos

// Una c o n s t a n t e n u m e r i c a
const double PI = 3 . 1 4 1 6 ;
// C a l c u l a e l a r e a : no m o d i f i c a a c
double a r e a ( const C i r c u l o & c ) ;
// E l punto d e v u e l t o s e m i r a y no s e t o c a .
// Tampoco m o d i f i c a a l c i r c u l o
const punto2d & C i r c u l o : : c e n t r o ( ) const ;
// e s t e punto s i s e puede m o d i f i c a r ! ( o j o ! )
// tampoco m o d i f i c a a l c i r c u l o
punto2d & C i r c u l o : : c e n t r o ( ) const ;

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

To const or not to const

c l a s s GatoMontes {
public :
int vidas ();
};
// e s t o no va a c o m p i l a r . . . p o r ?
v o i d m o s t r a r V i d a s ( const GatoMontes& g ) {
c o u t << g . v i d a s ( ) << e n d l ;
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

To const or not to const

c l a s s GatoMontes {
public :
i n t v i d a s ( ) const ;
};
// Ahora s i !
v o i d m o s t r a r V i d a s ( const GatoMontes& g ) {
c o u t << g . v i d a s ( ) << e n d l ;
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Constructor por defecto

Constructor que no toma parametros


El compilador provee uno si no declaramos constructores
Ojo: se limita a usar los constructores por defecto de cada
miembro de la clase (si esto es posible).
Si alguno de los miembros no tiene constructor por defecto,
no va a compilar.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Constructor por defecto - ejemplos

c l a s s Test {
// Aca tenemos T e s t ( ) i m p l i c i t o
int a ;
};
c l a s s Test2 {
// Al d e c l a r a r e s t e , no hay
// c o n s t r u c t o r T e s t 2 ( ) i m p l i c i t o
T e s t 2 ( long l ) ;
};

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Constructor por copia

Constructor que siempre toma un const T&


Invocado cuando se pasan parametros por copia
El compilador provee uno si no lo declaramos nosotros.
Ojo: se limita a usar los constructores por copia de cada
miembro de la clase (si esto es posible).
Si alguno de los miembros no tiene constructor por copia, no
va a compilar.
Si alguno de los miembros es un puntero...

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Constructor por copia

Constructor que siempre toma un const T&


Invocado cuando se pasan parametros por copia
El compilador provee uno si no lo declaramos nosotros.
Ojo: se limita a usar los constructores por copia de cada
miembro de la clase (si esto es posible).
Si alguno de los miembros no tiene constructor por copia, no
va a compilar.
Si alguno de los miembros es un puntero... va a copiar el
valor del puntero! Eso no puede terminar bien...

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Constructor por copia - ejemplos


class copiable {
c o p i a b l e ( const c o p i a b l e& c2 ) {
t h i s >a = NULL ;
// Lo tenemos que c o p i a r
// e x p l i c i t a m e n t e ( s i c o r r e s p o n d e )
i f ( c2 . a != NULL)
t h i s >a = new i n t ( c2 . a ) ;
}
int a ;
};

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Listas de inicializacion
Sintaxis usada en los constructores para construir variables
miembro (algunas o todas)
Se vuelven indispensables cuando tenemos miembros sin
constructor por defecto
// E s f e r a . h
c l a s s punto3d {
double x , y , z ;
punto3d ( double x0 , double y0 , double z0 )
: x ( x0 ) , y ( y0 ) , z ( z0 ) { }
};
class esfera {
double r a d i o , punto3d c e n t r o ;
e s f e r a ( ) ; // n e c e s i t a l i s t a !
};
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Listas de inicializacion (2)


// E s f e r a . cpp
esfera : : esfera ()
: radio (1) , centro (0 ,0 ,0)
{
}
// o e q u i v a l e n t e m e n t e :
esfera : : esfera ()
: centro (0 ,0 ,0)
{
radio = 1;
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Listas de inicializacion - Otro ejemplo (3)


c l a s s Pp {
private :
i n t &v a l o r ;
public :
// Compila ?
Pp ( i n t &v )
{
valor = v ;
}
i n t sumarYRetornar ( ) ;
};

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Listas de inicializacion - Otro ejemplo (3)

c l a s s Pp {
private :
i n t &v a l o r ;
public :
// Ahora s .
Pp ( i n t &v ) : v a l o r ( v ) ;
i n t sumarYRetornar ( ) ;
};

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Operador de asignacion
Toma como parametro a un const T& y devuelve un T&
El compilador provee uno si no lo declaramos nosotros (dej`a
vu)
Ojo: se limita a usar los operadores de asignacion de cada
miembro
Si alguno de los miembros no tiene operador de asignacion,
no va a compilar.
Si alguno de los miembros es un puntero...

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Operador de asignacion
Toma como parametro a un const T& y devuelve un T&
El compilador provee uno si no lo declaramos nosotros (dej`a
vu)
Ojo: se limita a usar los operadores de asignacion de cada
miembro
Si alguno de los miembros no tiene operador de asignacion,
no va a compilar.
Si alguno de los miembros es un puntero... va a copiar el
valor del puntero! Eso no puede terminar bien...
Es sobre una instancia YA CONSTRUIDA: hay que limpiar
lo que ya estaba!

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Operador de asignacion - ejemplos


class asignable {
a s i g n a b l e& o p e r a t o r =( const a s i g n a b l e& a2 ) {
i f ( t h i s == &a2 ) r e t u r n t h i s ; // a = a
// HAY QUE BORRAR LO VIEJO !
i f ( t h i s >a != NULL) {
d e l e t e t h i s >a ;
t h i s >a = NULL ;
}
// c o p i a m o s s i c o r r e s p o n d e
i f ( c2 . a != NULL)
t h i s >a = new i n t ( c2>a ) ;
return t h i s ;
}
int a ;
};
Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Destructor
Operacion especial que se ejecuta al hacer delete de un
puntero a un objeto, o al salir de un scope para una variable
No se lo llama explcitamente.
Debe realizar todas las tareas de limpieza de memoria
dinamica necesarias... no queremos perder memoria!

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Destructor
Operacion especial que se ejecuta al hacer delete de un
puntero a un objeto, o al salir de un scope para una variable
No se lo llama explcitamente.
Debe realizar todas las tareas de limpieza de memoria
dinamica necesarias... no queremos perder memoria!
class leaker {
int p ;
l e a k e r ( i n t tam )
{ p = new i n t [ tam ] ; }
l e a k e r ( ) { / Dejo l o s p i n t s en e l l i m b o / }
};

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Destructor

class limpita {
int p ;
l i m p i t a ( i n t tam ) { p = new i n t [ tam ] ; }
l i m p i t a () { delete [ ] p ; }
// d e l e t e p h a c e l o mismo . . .
// . . . p e r o dep e n d e d e l c o m p i l a d o r ! !
// d e l e t e [ ] e s e l c o r r e c t o
}

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

estructuras de datos
const
Construcci
on
Operador =

Regla de tres

Cuando nos veamos obligados a definir...


...el constructor por copia;
...el operador de asignaci
on;
...o el destructor;
...probablemente tengamos que definir los tres.
Estos tres se autogeneran por el compilador si no los declaramos,
por lo que si lo que el compilador autogenera no sirve en un caso,
probablemente tampoco sirva en los demas.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Lista de alumnos de una materia

Cada elemento de esta lista es una tupla (L.U, Telefono)


implementada con un struct Alumno. Queremos algunas
operaciones basicas:
Crear una lista de alumnos
Conocer su longitud
Agregar elementos al principio/final
Obtener o eliminar el iesimo alumno de la lista

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Lista de alumnos de una materia

Cada elemento de esta lista es una tupla (L.U, Telefono)


implementada con un struct Alumno. Queremos algunas
operaciones basicas:
Crear una lista de alumnos
Conocer su longitud
Agregar elementos al principio/final
Obtener o eliminar el iesimo alumno de la lista
El archivo ListaAlumnos.h se encuentra colgado en la pagina para
que se diviertan.

Memoria Din
amica en C++

Memoria en C++
Punteros - Referencias
Clases
Y ahora, a trabajar!

Clase ListaAlumno
t y p e d e f u n s i g n e d l o n g Nat ;
s t r u c t Alumno {
i n t LU , t e l ;
};
c l a s s ListaAlumnos {
// C o n s t r u c t o r e s . . .
// O b s e r v a d o r e s
Nat l o n g i t u d ( ) c o n s t ;
c o n s t Alumno & i e s i m o ( Nat i ) c o n s t ;
Alumno & i e s i m o ( Nat i ) ;
// O p e r a c i o n e s
v o i d a g A d e l a n t e ( c o n s t Alumno & e l e m ) ;
v o i d a g A t r a s ( c o n s t Alumno & e l e m ) ;
v o i d e l i m i n a r ( Nat i ) ;
private :
s t r u c t Nodo { // . . .
}
};

Memoria Din
amica en C++

Vous aimerez peut-être aussi