Estructura de Datos En C++
Dr. Romeo Sánchez Nigenda.
E-mail: [email protected]
http://yalma.fime.uanl.mx/~romeo/
Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón
Horas de Tutoría: 10am-11am Martes y Jueves,
3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes.
Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/
Sesiones: 48
Clases (C++)

Una clase es un concepto de un tipo de datos abstracto (ADTs),
definiendo tanto el conjunto de valores de un cierto tipo (datos),
como el conjunto de operaciones que se ejecutan sobre tales
valores.

A la instanciación de la clase se le conoce como un objeto, define
un estado que es representado por los valores de sus atributos

A las operaciones como métodos definen el comportamiento del
objeto
Tipo de datos abstracto
Datos abstractos
Elementos Privados
Operaciones
Interface Pública
Clases (C++)
Para proveer un buen mecanismo de soporte de definición y uso de tipos,
Clases deben:

Soportar definiciones de tipo con:
◦ Estado de un programa (datos miembros de la clase)
◦ Definición de semántica (funciones de la clase)
◦ Inicialización (constructores de la clase)
◦ Terminación (destructores de la clase)

Soportar el uso de tipos:
◦ Globales, locales o vía New
◦ En argumentos a funciones
◦ Retornos de funciones

Comportamiento
◦ Capacidad de soportar operaciones definidas por el usuario
◦ Capacidad de soportar conversiones definidas por el usuario
◦ Capacidad de soportar asignación y copia de tipos
Clases: Principios básicos de POO

Encapsulación: Principio de esconder las estructuras de datos usadas,
y solo proveer una interface pública para operar sobre dichos datos.

La separación de estructuras de datos y operaciones, y la restricción
de solamente acceder a la estructura de datos vía una interface bien
definida, permite escoger independientemente las estructuras de datos
apropiadas al tipo de la aplicación class <classname> {
public:
<constructor>
<destructor>
<public data members>
<public member functions (methods)>
private:
<private data members>
<private member functions>
};
Clases: Relaciones

Un-tipo-de: (A-kind-of)
class Circle {
int x, y, radius;
public:
void setX(int);
int getX();
void setY(int);
int getY() ;
void setRadius(int);
int getRadius();
}

Es un tipo de
Es-un: (is-a)
Es un
class Point {
int x, y;
public:
void setX(int);
int getX();
void setY(int);
int getY()
}
Clases: Relaciones

Es-parte-de (is-part-of):
class Logo {
Circle circle;
Triangle triangle;
public:
void set(Circle) ;
}

Es parte de
Tiene-un (has-a):
Es parte de
Es parte de
Tiene un
Tiene un
Es parte de
Herencia (inheritance)

Relaciona objetos usando relaciones un-tipo-de y es-un. Es el
mecanismo que permite que una clase A herede propiedades de
una clase B. Ejemplo: Un Círculo hereda de un Punto:
Superclase
Subclase

class Circle : public Point {
int radius;
public:
void setRadius();
int getRadius();
}
Circle acircle;
acircle.setX(1);
acircle.setY(2);
acircle.setRadius();
La relación es-un implica que se puede utilizar un círculo en
cualquier lugar donde se espera un punto
Move(Point apoint, int deltax){
apoint.setX(apoint.getX()+deltax);
}
Circle circle;
Move(circle,10);
Clases abstractas
Describe únicamente las propiedades de un conjunto de
objetos sin especificar su comportamiento
 Cada subclase deberá entonces proveer métodos que
implementen los de la clase abstracta

abstract class Figura {
public:
print();
}
class Point : public Figura(){
public:
print(){ …;}
}
No es necesaria la implementación,
dependerá de las subclases…
Tipos genéricos
Cuando definimos una clase, en realidad definimos un tipo, podría
haber una lista de carros, frutas, números, etc.
 Usamos tipos genéricos para definir la clase
 Ya que no sabemos con que tipos la clase será usada, debemos
usar placeholders y referir a ellos como el tipo que opera la clase
 Por la tanto la definición de clase actuará como un template, la
clase actual se definirá cuando creemos un objeto.

template class List T{
public:
append(T element);
T getFirst();
T getNext();
}
Clase Template: Clase A
parametrizada con un tipo de datos
B. Una vez que un objeto de A es
creado, B es reemplazado un el tipo
actual de datos.
List Point pointList;
Point apoint;
pointList.append(apoint);
Polimorfismo

Permite que una entidad (variable, función, objeto) tome una
variedad de representaciones.

Concepto de linkeo dinámico, dependiendo de el contenido en un
determinado tiempo. Nos permite utilizar el mismo nombre para
funciones, mientras su lista de parámetros sea diferente
(overloading)
Boolean isNull(int i);
Boolean isNull(float r);

Objetos de una superclase pueden reemplazarse con objetos de
sus subclases.
void display (Figura o){
o.print
}
Circle c;
Point p; //Asuma que todas estas subclases extienden Figura
Square s;
display(c); //Utiliza la implementación de Circle.print
display(p); //Utiliza Point.print
Clases (C++): Ejemplo
Clase Fraction almacena números fraccionales: 4/5, 1/3,
Simplifica radios: 3/3 = 1/1, 3/6= 1/2, 6/2=3/1, -1/-1=1/1
Soporta operadores: +, *, /
Área privada
class Fraction{
long numerador;
long denominador;
void normalize(void);
long gcf(long, long); //Greatest common factor
long lcm(long,long); //Lowest common denominator
public:
Fraction(void);
Fraction (long);
Fraction (long,long);
long get_numerator();
long get_denominator();
…
}
Clases (C++)

Constructores y homogeneidad:
Fraction::Fraction(void){
//Supone que un número racional es 0
numerador = 0;
denominador = 1;
}
Fraction::Fraction(long i){
numerador = i;
denominador = 1;
}
Fraction::Fraction(long i, long j){
numerador = i;
denominador = j;
normalize();
}
void main(){
Fraction r;
//0/1
Fraction r(3);
// 3/1
Fraction r(2,5); // 2/5
}
Clases (C++)

Implementación de métodos
long Fraction::get_numerator(){
return numerator;
}
Returna datos privados
long Fraction::get_denominator(){
return denominator;
}
Inline functions:
public:
long get_numerator(){return numerator;}
long get_denominator(){return denominator;}
Descargar

Introducción a POO