Sunteți pe pagina 1din 39

CLASES Y OBJETOS

POO Y ESTRUCTURA DE DATOS

DEFINICION DE UNA CLASE

Una clase es un tipo definido por el usuario. La definicin de una clase especifica cmo son los objetos de esa clase, es decir de que miembros consta y el conjunto de operaciones que pueden aplicarse a tales objetos.

SINTAXIS DE UNA CLASE


Consta de dos partes:

.La primera est formada por el nombre de la clase precedido por la palabra reservada class LA segunda parte es el cuerpo de la clase encerrada entre llaves y seguido por un punto y coma.

class nombre_clase { especificadores de acceso atributos o miembros mtodos };

ESPECIFICADORES DE ACCESO
El concepto de la misma incluye la idea de ocultacin de datos, se utiliza los especificadores de para restringir el acceso a los datos miembros de una clase, C++ Provee las palabras Clave: - private - public - protected Una clase puede tener ms de una seccin publica, privada o protegida. Una seccin finaliza donde comienza la siguiente.

PRIVATE
Un miembro declarado como private puede ser utilizado solamente por las funciones miembro de su propia clase o por funciones amigas(friend) de su clase. En cambio, no puede ser utilizada por funciones externas o por funciones de una derivada.

PROTECTED
Un miembro declarada como protegido se comporta exactamente igual que uno privado para las funciones externas, pero actua como miembro publico para las funciones miembro de una clase derivada.

PUBLIC
Un miembro declarado como publico es accesible en cualquier parte del programa donde el objeto de la clase en cuestion sea accesible.

#include <iostream.> Class fecha { private: // especificador de acceso int dia,mes, anyo; // miembros public : void ingresar( ); // mtodo void mostrar( ); //mtodo }; void main() { fecha f; // instanciar el objeto f.ingresar(); // llamar al mtodo f.mostrar(); }

Ejemplo

CONSTRUCTORES
Un constructor es una funcin especial que sirve para construir o inicializar objetos y asignar valores a sus miembros dato. Se caracteriza por: Tener el mismo nombre de la clase que inicializa No devuelve valores. Puede admitir parmetros como cualquier otra funcin Puede existir ms de un constructor, e incluso no existir

DESTRUCTORES
Un destructor es una funcin miembro especial de una clase que se utiliza para eliminar un objeto de una clase, liberndose la memoria que ocupa.

Un destructor de clase es llamado automticamente cuando un objeto de una clase se sale de alcance. Solo puede definirse un destructor para cada clase, no recibe parmetros ni regresa ningn valor. Los destructores se declaran con el nombre de la clase prefijado con una tilde (~):

Ejemplo de constructor y destructor


Class Punto { int x, y ; public : Punto ( ) { X = 0; Y = 0; } Punto (int xx; int yy) { X= xx; Y=yy; } ~ Punto () { cout << objeto eliminado; } };

Miembros estticos de una clase


Un miembro de una clase se puede declarar esttico(static). Para un miembro dato, la designacion static significa que existe slo una instancia de ese miembro. Estos miembros solo pueden ser compartidos por todos los objetos de una clase y existe incluso si ningun objeto de esta clase existe siendo su valor comun a la clase completa.
#include <iostream.h> class contador { static int cuenta; public : void leercuenta(int j) { cuenta=j; } void vercuenta() { cout<<cuenta << ; } }; int contador::cuenta; void main( ) { contador a,b; a.vercuenta ( ); //imprime 0 b.vercuenta ( ); //imprime 0 a.leercuenta (10) a.vercuenta ( ); //imprime 10 b.vercuenta ( ); //imprime 10 }

Funciones miembro estticas(static)


Las funciones miembro estticas(static) slo pueden acceder a otras funciones y datos estticos declarados en una clase, pero no pueden manipular funciones ni datos no estticos

Ejemplo : Desarrollar un programa para encontrar la media de una serie de notas con constructor , destructor y con miembros estticos
#include <iostream.h> class notas { private: float nota; static float suma_notas; static int nro_alumnos; public: notas (float n) //constructor { nota=n; suma_notas +=nota; nro_alumnos++; } ~notas( ) // destructor { suma_notas-=nota; nro_alumnos--; }
void visualizar(); static void media() { float m; m=suma_notas / nro_alumnos; cout<<" \n la nota media es : " <<m; } }; //fin de la clase void notas::visualizar() { cout<<"\n la nota es : "<< nota; } // inicializacin de miembros estticos float notas::suma_notas=0; int notas::nro_alumnos=0; void main() { notas n1(5), n2(7), n3(9), n4(10); n1.visualizar(); n2.visualizar(); n3.visualizar(); n4.visualizar(); notas::media(); }

PROGRAMACION DINAMICA
La asignacin dinmica de memoria consiste en asignar la cantidad de memoria necesaria para almacenar un objeto durante la ejecucin del programa, en vez de hacerlo en el momento de la compilacin del mismo. Se utilizan dos operadores para asignacin dinamica de memoria: NEW DELTE

Operador New
new tipo; El operador new crea en forma automtica un new tipo[n_elementos] objeto del tamao apropiado, llama el Ejemplo 1: constructor para el int *p; objeto (si hay uno p= new int; apropiado) y regresa Ejemplo 2: un apuntador del tipo char * s; correcto. Si new no cin>>n; puede encontrar s= new char[n]; espacio, regresa un apuntador 0

Operador Delete
Mediante el operador delete destruye un objeto creado por el operador new, liberando as la memoria ocupada por dicho objeto

Delete direccin Libera un espacio previamente asignado


por new a la direccin indicada

delete[n] direccin
libera el espacio asignado si es un array , destruyendo todos los elementos

Ejemplo:

Delete p; Delete[10] c;

Ventajas de new y delete


1. 2. 3. 4.

New conoce cuantas memoria se asigna a cada tipo de variable. New hace que se llame a un constructor para el objeto asignado Delete primero llama al destructor y despus libera memoria New invoca al constructor de manera automatica, y delete automticamente invoca al destructor de la clase.

Ejemplos

declara y asigna almacenamiento para un entero int *p = new int; delete p; Declara un array de 10 enteros; int *p=new int[10] delete[10] p; Declara y asigna memoria de tipo clase fecha fecha *hoy =new fecha(2,12,2007); delete hoy;

Ejemplo con constructores, destructores, new y delete


#include <iostream.h> #include <stdio.h> #include<string.h> #include <conio.h> class persona { private: int *edad; char *nombre; public: persona(int *e, char *nom) { edad=new int; edad=e; nombre=new char[strlen(nom)+1]; strcpy(nombre,nom); } ~persona() { delete edad; delete nombre; cout<<"\n ficha eliminada"; } void mostrar() { cout<<" \n nombre : "<<nombre; cout<<" \n edad : "<<*edad; } };//fin clase void main() { int *e; char n[15]; cout<<"INGRESE LA EDAD : " ; cin>>*e; cout<<"INGRESE EL NOMBRE DE LA PERSONA"; gets(n); persona p(e,n); clrscr(); p.mostrar(); getch(); }

Funciones amigas
Una funcin amiga es una funcin no miembro de una clase que puede tener acceso a las partes privadas de una clase; se debe declarar como amiga de la clase mediante la palabra reservada friend. Las funciones amigas se declaran situando su prototipo de funcin en la clase de la que son amiga precedindola con la palabra reservada friend Una funcin amiga puede declararse en cualquier seccin de la clase.No es miembro de la clase, por lo que no se ve afectada por los modificadores private y public. Una funcin puede ser amiga de una clase y miembro de otra.

Encontrar la distancia entre dos puntos


#include<iostream.h> #include<conio.h> #include<math.h> class Punto { private : float x; float y; public : Punto ( float a, float b ); void visualizar ( ); friend float distancia( Punto p1, Punto p2); };
Punto::Punto (float a, float b) { x =a; y=b; } void Punto::visualizar() { cout<< las coordenadas del punto es :<<x<<.<<y<<\n; } float distancia ( Punto p1, Punto p2) { float d; d= sqrt( sqrt(p2.x-p1.x)+sqrt(p2.y- p1.y) ); return d; void main( ) {Punto p1(10,2),p2(20,8); float Dis; Dis=distancia(p1,p2); clrscr(); p1.visualizar(); getch(); p2.visualizar(); getch( ); cout<<"la distancia entre los dos punto es: <<Dis;

Analisis del ejemplo

La implementacin de la funcin distancia, no hace uso del operador de mbito (::) porque es una funcin amiga de Punto, pero no pertenece a la clase. La llamada no necesita hacerse a travs de un objeto de la clase.

Porque utilizar funciones amigas


1.

2.

Las razones fundamentales para utilizar funciones amigas es que algunas funciones necesitan acceso privilegiado a ms de una clase. Una segunda razn es que las funciones amigas pasan todos sus argumentos a travs de la lista de argumentos y cada valor de argumento se somete a la conversin de asignacin.

Clases amigas
Una clase completa puede ser amiga de otra clase. En este caso todas las funciones de la clase amiga pueden acceder a las partes privadas de la otra clase. Una clase amiga puede ser declarada antes de que pueda ser designada como amiga SINTAXIS :

friend class NombreClase;

Ejemplo de Clases amigas


class animales; class hombre { public: friend class animales; }; class animales {//.. };

Prototipo para que la Clase1 reconozca la existencia de la Clase2 Clase animal es amiga de la clase hombre

Cada funcin miembro de animales es amiga de la clase hombre. La designacin de un amigo puede estar en una seccin private o public de una clase.

Realizar un Prog. con dos clases coche y camion determinar quien es mas veloz
#include <iostream.h> #include <conio.h> class Camion; // referencia anticipada class Coche { private: int plazas velocidad; public: Coche(int p, int v) { plazas = p; velocidad = v; } friend class Camion; }; class Camion { private: int peso, velocidad; public: Camion(int p, int v) { peso = p; velocidad = v; } void mas_veloz(Coche t ) ; }; void Camion::mas_veloz ( Coche t ) { int comp; comp = t.velocidad-velocidad; if (comp < 0) cout << " El camin es ms rpido " ; else if (comp == 0) cout << " Son igual de rpidos " ; else cout << " El coche es ms rpido " ; } void main() {int p,v; cout<<"ingrese la cantidad de asientos disponibles del coche : "; cin>>p; cout<<"ingrese velocidad del coche : "; cin>>v; Coche c(p,v); cout<<"ingrese el peso del l camion : "; cin>>p; cout<<"ingrese velocidad del camion : "; cin>>v; Camion ca(p,v); ca.mas_veloz(c); }

CLASES CONTENEDOR E INTERADORES


Las clases contenedor (o clase coleccin) estn diseadas para contener colecciones de objetos, como puedan ser arreglos y listas enlazadas. Asociamos iteradotes con la clase de coleccin. Un iterador es un objeto que regresa el siguiente elemento de una coleccin. Una clase contenedor puede tener varios iteradotes operando sobre ella simultneamente. El recorrido de una estructura de datos es implementado usando iteradotes. Estos garantizan la visita a cada item de su estructura de datos asociada en un orden bien definido.

Propiedades
Deben proveer al menos las siguientes propiedades : 1. Elemento actual. El iterador visita los elementos de datos uno a la vez . El elemento que se visita actualmente es llamado el elemento actual
2.

funcin sucesor: La ejecucin del paso siguiente elemento de datos depende de la estrategia de recorrido implementada por el iterador. Condicin de terminacin. El iterador debe proveer un mecanismo que chequee si han visitado todos los elementos, o si falta alguno por visitar.

1.

Herencia
La herencia es un potente mecanismo para definir una nueva clase a partir de otra. La nueva clase puede aadir caractersticas sin tener que reprogramar toda la clase de nuevo. La herencia permite: Adoptar automticamente caractersticas ya implementadas.
Ahorro de tiempo y esfuerzo

Adoptar automticamente caractersticas ya probadas.


Menor tiempo de prueba y depuracin

TERMINOLOGA

Clase base: La clase base es la clase ya creada, de la que se hereda. Tambin se la denomina clase madre o superclase. Clase derivada: es la clase que se crea a partir de la clase base. Se dice que es la clase que hereda. Tambin se la denomina clase hija o subclase.
CIVIL

ALUMNO

MILITAR

Creacin de la clase derivada: sintaxis


Cuando se crea una clase (clase derivada) a partir de otra ya existente (clase base), se utiliza la siguiente sintaxis: class Subclase : public Superclase { // lista de miembros pblicos y privados };

Subclase adopta todos los miembros protegidos y pblicos. Subclase puede definir miembros adicionales, as como redefinir los heredados.

Ejemplo de herencia
class ClaseBase { private: int b1 ; int b2 ; public: int b3 ; void metodo_base1 (int a); void metodo_base2 (); }; class ClaseDerivada : public ClaseBase { private: float s1 ; char s2 ; public: float metodo_deriv1 (); void metodo_deriv2 (char x); };

La clase derivada hereda de la clase base los miembros y los metodos declarados como publicos. Los privados la clase derivada o puede haceder si se quiere haceder desde la clase derivada b1y b2 deben ser declarados con protegidos

Miembros que no se heredan automticamente

La clase derivada hereda todos los atributos y todos los mtodos,excepto: Constructores Destructor

Constructores y destructor: Si en la subclase no estn definidos, se crea un constructor por defecto y un destructor, aunque sin que hagan nada en concreto. Se deben crear los constructores y el destructor en la subclase.

#include<iostream.h> #include<conio.h> #include<stdio.h> class alumno //clase padre { private: long ci; char nom[30], carrera[20]; public: void leer() { cout<<"ingrese CI del alumno"; cin>>ci; cout<<"ingrese nombre ; gets(nom); cout<<"ingrese carrera; gets(carrera); }

Ejemplo de herencia
void mostrar() { cout<<"CI del Alumno <<ci; cout<<"Nombre del alumno <<nom; cout<<"Carrera del alumno <<carreral; } };//fin de la clase padre

Jerarqua de Clases
A medida que se establecen relaciones de herencia entre clases, se va construyendo la jerarqua de clases del sistema.
Persona alumno Adm contrato Docente permanente

civil

militar

Jerarqua de Clases

Cada clase de la jerarqua, debe implementar todas las caractersticas que son comunes a todas sus subclases. Cada subclase debe contemplar nicamente las peculiaridades que la distinguen de su superclase.

class civil: public alumno { private: float mens; public: void leer_datos() { alumno::leer(); cout<<"ingrese la mensualida "; cin>>mens; } void cdatos() { alumno::mostrar(); cout<<"mensualidad a cancelar "<<mens<<endl; } };

class militar: private alumno { private: char rango[12]; char fuerza[15]; public: void leer_datos() { alumno::leer(); cout<<"ingrese el rango"<<endl; cin>>rango; cout<<" Ingrese fuerza "<<endl; gets(fuerza); } void mdatos() { alumno::mostrar(); cout<<"su rango es "<<rangol; cout<<"su fuerza es <<fuerza; } };

void main() { int o; militar mili1,mili2; civil civ1,civ2; do { cout<<"1.registrar datos de militares"<<endl; cout<<"2. registrar datos de civiles"<<endl; cout<<"3. Mostrar datos civiles"<<endl; cout<<"4. Mostrar datos de militares"<<endl; cout<<"5. salir"<<endl; cin>>o; switch(o) { case 1: mili1.leer_datos(); mili2.leer_datos(); break; case 2: civ1.leer_datos(); civ2.leer_datos(); break; case 3: civ1.cdatos(); civ2.cdatos(); break; case 4: mili1.mdatos(); mili2.mdatos(); break; } }while (o=!5); }

S-ar putea să vă placă și