PDF de programación - Seminario de C++ - Algoritmos y Estructuras de Datos - 2º de Ingeniería Informática - Sesión 2

Imágen de pdf Seminario de C++ - Algoritmos y Estructuras de Datos - 2º de Ingeniería Informática - Sesión 2

Seminario de C++ - Algoritmos y Estructuras de Datos - 2º de Ingeniería Informática - Sesión 2gráfica de visualizaciones

Actualizado el 20 de Mayo del 2018 (Publicado el 16 de Abril del 2017)
1.018 visualizaciones desde el 16 de Abril del 2017
223,2 KB
9 paginas
Creado hace 15a (06/10/2008)
Algoritmos y Estructuras de Datos

Ingeniería Informática, Curso 2º, Año 2008/2009

SEMINARIO DE C++
(orientado a programadores java,

pero no es parte del plan piloto, sólo para alumnos de AED)



Sesión 2



Contenidos:

1. Definición de clases
2. Implementación de los métodos
3. Constructores y destructores
4. Objetos dinámicos
5. Algunas notas
Ejercicios



Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2

2/9



1. Definición de clases

• La programación orientada a objetos se basa en el uso de clases y objetos.

o Modelo imperativo: un programa es una sucesión de instrucciones que
o Modelo orientado a objetos: un programa está formado por un conjunto

se ejecutan secuencial o iterativamente.

de objetos que se comunican entre sí.

• Naturaleza dual de las clases:

o Una clase es un tipo abstracto de datos (mecanismo para crear nuevos
tipos definidos por el usuario). Mecanismo similar a las estructuras, pero
incluyendo tanto los datos y como las funciones del tipo.
o Una clase es un módulo que proporciona encapsulación (agrupa
funciones y datos) y ocultamiento de la implementación (parte private
y parte public).



// persona es una clase

• Un objeto es una variable cuyo tipo es una clase.

class persona
{
char nombre[80];
long dni, telefono;
int edad;

void leer (FILE *f);
void escribir (void);
};

persona p1;
p1.leer(f1);
p1.edad++;
p1.escribir();


IMPORTANTE: en C++, la sentencia persona p1 está declarando un objeto, no
una referencia a objeto (como en java), de modo que el objeto es directamente
creado, sin necesidad de un new posterior; en java sería, por contra:


// p1 es un objeto de clase persona



persona p1;
p1 = new persona();


• Nomenclatura:

o Miembros de una clase: atributos y operaciones de la clase (datos y
funciones miembro). Ej.: nombre, dni y edad son datos miembros de la
clase persona.
o Métodos de una clase: funciones definidas dentro de esa clase. Ej.: leer()
o Mensaje: invocación de un método sobre un objeto. Ej.: p1.leer(f1); y
o Objeto receptor: el objeto receptor de un mensaje es el objeto sobre el que

p1.escribir(); son mensajes aplicados sobre el objeto p1.

y escribir() son métodos de la clase persona.

se aplica. Ej.: en p1.leer(f1), el objeto receptor es p1.

Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2

3/9



• Declaración de una clase. Sintaxis.
class nombre {
... // Miembros de la clase
};

• Miembros públicos y privados.

o Miembros públicos. public: Son accesibles para el usuario de la clase.
o Miembros privados. private: No son visibles para el usuario de la clase.
o Estas palabras delimitan secciones completas de miembros públicos/privados,

al contrario que en java, donde acompañan a cada miembro.



class nombre {
private:
... // Miembros privados
public:
... // Miembros públicos
};


o Pueden aparecer varias veces (y en distinto orden) las cláusulas public: y
o Por defecto, si no se indica nada, los miembros son private.

private:

• Declaración de los miembros de una clase: Igual que la definición de variables

y funciones.
o No se permite inicialización de los datos miembros.
o En las funciones miembro, el objeto receptor es un parámetro implícito, no

hace falta indicarlo.

• Ejemplo.

class conjuntoInt {
private:
int tamano;
int datos[MAXIMO];
public:
void vaciar ();
void insertar (int n);
void suprimir (int n);
bool miembro (int n);
};

class vacia {};

class listaFloat {
private:
listaFloat * siguiente;
listaFloat * anterior;
public:
float actual;
int longitud ();
void insertar (float valor);
listaFloat * avanzar ();
listaFloat * retroceder ();
};

Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2

4/9



2. Implementación de los métodos

Igual que la implementación de una función.




• En java, los métodos de implementan dentro de la clase. En cambio, en C…
• … normalmente, la implementación de los métodos va aparte (fuera) de la
definición de la clase. Se utiliza el operador de visibilidad ‘::’ para asociar el
nombre del método al de la clase a la que pertenece (en java no hace falta porque
el método está dentro de la clase).


void conjuntoInt::vaciar ()
{
...
}
void conjuntoInt::insertar (int n)
{
...
}
• Dentro de un método todos los miembros de esa clase (tanto públicos como



privados) son accesibles como si fueran variables (o funciones) locales.


void conjuntoInt::insertar (int n)
{
if (tamano<MAXIMO)
datos[tamano++]= n;
else
cerr << ″ERROR: el conjunto está lleno.″;
}

• Métodos in-line.





(como se hace en java).

o También se puede implementar el método dentro de la definición de la clase
o Los métodos de este tipo se llaman in-line: el compilador, al encontrar una
o No es muy aconsejable, a menos que el método sea trivial.

llamada, la sustituye directamente por el código del método (en java no).

#include <iostream>
using namespace std;
class contadorModulo10 {
private:
int estado;
public:
void iniciar() {estado= 0;}
void avanzar(int n= 1) {estado= (estado+n)%10;}
int valor() {return estado;}
};
main ()
{
contadorModulo10 cnt;
cnt.iniciar(); // ¿Qué ocurre si quitamos esto?
cnt.avanzar(12);
cnt.avanzar(); // ¿Cuánto avanza aquí?
cnt.avanzar();
cout << cnt.valor(); // ¿Qué debería imprimir?
}

Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2

5/9



• Ejemplo. Clase conjunto de enteros con tamaño máximo limitado.
#include <iostream>
#define MAXIMO 100
using namespace std;

///////////// Declaración de la clase conjuntoInt /////////////
class conjuntoInt {
private:
int tamano;
int datos[MAXIMO];
public:
void vaciar ();
void insertar (int n);
bool miembro (int n);
};

///////////// Implementación de los métodos /////////////
void conjuntoInt::vaciar ()
{
tamano= 0;
}
void conjuntoInt::insertar (int n)
{
if (tamano<MAXIMO)
datos[tamano++]= n; // Ojo, no se comprueba si ya está el n
else
cerr << "ERROR: el conjunto está lleno.";
}
bool conjuntoInt::miembro (int n)
{
for (int i= 0; i<tamano; i++)
if (datos[i]==n)
return true;
return false;
}

///////////// Programa principal /////////////
int main (void)
{
conjuntoInt cjt;
cjt.vaciar(); // ¿Qué pasa si lo quitamos?
char comando;
cout << ">> ";
while ((cin>>comando) && (comando!='q')) {
int valor;
if (comando=='i') {
cin >> valor;
cjt.insertar(valor);
cout<<"Insertado el "<<valor;
}
else if (comando=='m') {
cin >> valor;
cout<<"¿Miembro "<<valor<<"? "<<(cjt.miembro(valor)?"SI":"NO");
}
else
cout << "Comando " << comando << " no válido. ";
cout << "\n>> ";
}
return 0;
}

Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2

6/9

3. Constructores y destructores



• Constructor: es una operación de inicialización de un objeto (como en java).
• Por defecto, si no se definen constructores, los datos miembros de un objeto no



se inicializan.


que la clase.


• El constructor de una clase es un método de esa clase, con el mismo nombre

class conjuntoInt {
...
public:
conjuntoInt () {tamano= 0;} // Constructor del tipo
...
};

o El constructor no devuelve ningún valor.
o Se puede aplicar sobrecarga: pueden haber distintos constructores, siempre

que los parámetros de entrada sean distintos.


class conjuntoInt {
...
public:
conjuntoInt () {tamano= 0;} // Constructor de conjunto vacio
conjuntoInt (int e1) // Constructor de cjt. con 1 elem.
{datos[0]= e1; tamano= 1;}
conjuntoInt (int e1, int e2) // Constructor de cjt. con 2 elem.
{datos[0]= e1; datos[1]= e2; tamano= 2;}
...
};

• Constructor por defecto: si existe algún constructor sin parámetros (o con

todos los parámetros por defecto) se toma como constructor por defecto.


• Uso de constructores1.


conjuntoInt cjt; // Se inicializa con el constructor por defecto
conjuntoInt cjt(9); // Constructor que incluye 1 elemento
conjuntoInt cjt(23,12); // Constructor que incluye 2 elementos
...

• Destructor: operación de eliminación de un objeto.

o en JAVA no hay desctructores, sino recolector de basura (automático).
o El nombre del destructor es 'ÑombreClase'.
o No devuelve ningún valor, ni recibe ningún parámetro.
o Necesario definir destructor si el objeto ha reservado memoria dinámica o

abierto algún fichero. Programador responsable de liberar/cerrar.



class conjuntoInt {
...
public:
~conjuntoInt () {cout<<"Nada";} // Destructor, irrelevante aquí
...
};


1 IMPORTANTE: en los tres ejemplos que siguen, los objetos, no sólo las referencias, son directamente
creados por estas declaraciones, si necesidad de hacer un new posterior.














Algoritmos y Estructuras de Datos, 2007/2008
Seminario de C++ – Sesión 2


4. Objetos en memoria dinámica

7/9









• Igual que con cualquier otro tipo de datos. Se pueden crear nuevos objetos en

memoria dinámica con new, new[] y eliminarlos con delete y delete[].

• Es como en java, pero con uso explícito de punteros (en vez de referencias

indirectas), y con nec
  • Links de descarga
http://lwp-l.com/pdf2994

Comentarios de: Seminario de C++ - Algoritmos y Estructuras de Datos - 2º de Ingeniería Informática - Sesión 2 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad