Anda di halaman 1dari 60

Memoria en C++

Punteros - Referencias
Clases
Y ahora, a trabajar!

Memoria Dinamica en C++

Memoria Dinamica en C++


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

Que es una variable?

Matematica: una etiqueta que representa a un valor en una


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

Memoria Dinamica en C++


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

Propiedades basicas

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

Nombre: x

Memoria Dinamica en C++


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

Propiedades basicas

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

Nombre: x
Tipo: int

Memoria Dinamica en C++


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

Propiedades basicas

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

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

Memoria Dinamica en C++


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

Propiedades basicas

int x = 0;
x += 1 0 ; // e q u i v a l e a x=x +10;
x++; // 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 Dinamica en C++


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

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 Dinamica en C++


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

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 Dinamica en C++


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

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 Dinamica en C++


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

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 Dinamica en C++


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

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 Dinamica en C++


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

Variables en la pila (1/5)

Memoria Dinamica en C++


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

Variables en la pila (2/5)

Memoria Dinamica en C++


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

Variables en la pila (3/5)

Memoria Dinamica en C++


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

Variables en la pila (4/5)

Memoria Dinamica en C++


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

Variables en la pila (5/5)

Memoria Dinamica en C++


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

Modelo de memoria: Abstrayendo

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


Cada variable ocupa una o mas posiciones del array segun su
tamano
El tamano depende del tipo, del compilador, y de la
arquitectura

Memoria Dinamica en C++


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

Veamos un mapa

Memoria Dinamica en C++


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

Punteros

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


Valor (numerico): una direccion 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 Dinamica en C++


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

Repitan conmigo: FLECHAS

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


apunta a un objeto en algun 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 Dinamica en C++


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

Veo los punteros!

pos: 777 1234

1101

777

int * p
pos: 1101
int **q

Memoria Dinamica en C++


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

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 Dinamica en C++
Memoria en C++
Punteros - Referencias Punteros
Clases Referencias
Y ahora, a trabajar!

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 Dinamica en C++


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

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 Dinamica en C++


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

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 direccion 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 Dinamica en C++


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

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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Veremos...

El const
Constructor por defecto
Constructor por copia
Listas de inicializacion
Operador de asignacion
Destructor

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Veremos...

El const
Constructor por defecto
Constructor por copia
Listas de inicializacion
Operador de asignacion
Destructor
Pero primero, un poco de motivacion

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 tamano dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
Como hacemos?

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 tamano dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
Como hacemos?
Representacion: cadena de nodos de longitud variable. Sin
usar memoria dinamica no alcanza. . . por que?

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 tamano dinamico.
con operaciones: nueva, agregarAtras/Adelante, iesimo,
longitud...
Como 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Ejemplo estructuras

Listas simple y doblemente encadenadas. Como es una lista


vaca? Como se hace para agregar adelante? y atras?
En la lista podriamos tener puntero al primero, al ultimo, la
longitud (?), etc.
Por que es indispensable la memoria dinamica? (Concretamente)
Memoria Dinamica en C++
Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 solo 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 funcion/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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 solo 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 solo lectura el
puntero y el apuntado.

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 solo 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 solo lectura el
puntero y el apuntado.
... que un const gato montes. T y const T no son lo mismo!!!

Memoria Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++
Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Operador de asignacion

Toma como parametro a un const T& y devuelve un T&


El compilador provee uno si no lo declaramos nosotros (deja
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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Operador de asignacion

Toma como parametro a un const T& y devuelve un T&


El compilador provee uno si no lo declaramos nosotros (deja
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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++
Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! 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 Dinamica en C++


Memoria en C++ estructuras de datos
Punteros - Referencias const
Clases Construccion
Y ahora, a trabajar! Operador =

Regla de tres

Cuando nos veamos obligados a definir...


...el constructor por copia;
...el operador de asignacion;
...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 Dinamica 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 Dinamica 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 Dinamica 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 Dinamica en C++

Anda mungkin juga menyukai