You are on page 1of 28

DcimosegundaSesin

Metodologas y Tcnicas de Programacin II

Programacin Orientada a Objeto (POO) C++

Repaso Primera Parte


1

Programa
Introduccin a la POO Repaso de Conceptos
Historia de la Programacin Conceptos de POO Estndares de Programacin Punteros y Memoria C++ Mi primera Clase E/S Control y Operadores

Clases y Objetos en C++


Uso y aplicacin Constructores Constantes e inline

Funciones Amigas Sobrecarga de Funciones

Sobrecarga
De Operadores Creacin Dinmica de Objetos

Herencia.

Tipos de Visibilidad

Herencia Mltiple

Polimorfismo
Funciones Virtuales Polimorfismo y Sobrecarga.

Plantillas

Contenedores

Iteradores

12.1Repaso
Qu es programar?
Programar es tener en cuenta

Un problema: Quiero saber mi nota final en la asignatura. Un Conjunto de Datos En las prcticas diarias tengo un En la prctica final tengo un En el exmen parcial un En el exmen final un : : : : 8 9 6 7

Unas funciones o algoritmos Nota Prcticas = (20% Prac.D) + (80%* Prac.F) Nota Final = 20% Nota.Prac. + 15% Parcial + 65% Final Aplicar las funciones para resolver el problema (7,21)
3

Y entonces...

12.1Repaso
Qu es programar?
Queremos por supuesto que nuestro programa: Sea Correcto: Funciona bien y de acuerdo a los requisitos. El resultado se corresponde con unas especificaciones. Pero que adems: Sea Eficaz Lo hace en un tiempo admisible. Especificaciones No Funcionales o de Calidad.

Sea Adaptable o Flexible Qu pasa si cambian las especificaciones? Sea Reutilizable Sera ideal que ante problemas parecidos, no tenga que volver a escribir todo el cdigo y pueda aprovechar la mayor parte de l.
4

12.1Repaso
Compilacin y Enlazado por separado
Alumno.h
includeAlumno.h

AlumnoM2.h
includeAlumno.h includeAlumnoM2.h includeAlumnoM2.h

Alumno.cpp

AlumnoM2.cpp

test_main.cpp

Compilador

Compilador

Compilador

Alumno.obj

AlumnoM2.obj
Enlazador

test_main.obj

Practica7.exe 5

12.1Repaso
Buscamos la Reutilizacin Sistemtica - (POO) Queremos escribir slo el cdigo necesario, equivocarnos menos, poner y quitar funcionalidad de forma fcil. Todo es un Objeto: - Un objeto es como una variable mejorada. - Un objeto es una instancia de una clase determinada. Los objetos se comunican mediante mensajes: - Los programas sern grupos de objetos envindose mensajes entre s. Caractersticas: - Abstraccin - Encapsulacin C++: - Lenguage de Propsito General - Lenguaje Orientado a Objeto. - Eficiente y elegante - 3.000.000 programadores (se usa) - Herencia - Polimorfismo Alumno
nombre_:string apellido1_:string apellido2_:string dni_:string edad_:int +nombre(stringnom) +apellido1(stringa1) +apellido2(stringa2) +dni(stringdni) +edad(intanios) +nombre():string +apellido1():string +apellido2():string +dni():string +edad():int

12.1Repaso
Estndares

Nombres de Ficheros:

Rectgulo.h (#ifndef NOMBRE_CLASE_H ...) Rectangulo.cpp test_Rectangulo.cpp (main)

Documentacin de Cabeceras de Ficheros.


/** *@filetest_Rectangulo.cpp *@briefPruebassobrelaclaseRectangulo.EjemploMetodosII * *@authorJoseLuisMarina<jlmarina@nebrija.es> *@date19FEB2007 */

Documentacin Cabeceras de Clases. Nombres de Clases, Objetos, atributos y mtodos Indexado y corchetes Ayudan a: Reutilizar Cdigo a Documentar (Cdigo ms comprensible)
7

12.1Repaso
Programacin Estructurada Funciones
Encapsulan la complejidad Declaracin (.h) : Implementacin:
inttranslate(floatx,floaty,floatz) { x=y=z; return33; } //Correcto inttranslate(floatx,floaty,floatz);voidf(void)

Control del Flujo


if(expresion) { sentencias } else { sentencias } while(guess!=secret) { cout<<"Numero:"; cin>>apuesta; } swicth(c) //do{}while() { case'a':.... } for(i=0;i<128;i++) { cout<<i;

12.1Repaso
Programacin Estructurada Operadores
Matemticos Lgicos Unarios Ternario (+ , - , *, /, %) (&&, ||) (-, + , ++, --) Relacionales Bits Direcciones (>, >=, <, <=, ==, !=) (&, |, ^, >>, <<) (&, *, ->)

a=b?b:(b=99);

Casting o Moldeado

Hay que utilizarlo con mucho cuidado y en pocas ocasiones


i=l;//Posibleperdidadedigitos i=f;//Posibleperdidainfo, i=static_cast<int>(l);//nowarning i=static_cast<int>(f);//nowarning charc=static_cast<char>(i);

Operador sizeof

Nmero de bytes utilizado por un tipo de datos o por una variable.

12.1Repaso
Programacin Estructurada Tipos de Datos
Bsicos: Predefinidos Se combinan con : char, int, float, double) : long y short signed y unsigned.

Sus lmites estn en limits.h y float.h


#defineSHRT_MIN(32768) #defineSHRT_MAX32767

Algunas combinaciones no valen (long float

-- unsigned float )

Creados por el usuario (programador) El compilador aprende a usuarlos. Utiliza las declaraciones (por ejemplo de la clases)

10

12.1Repaso
Punteros
Las direcciones de memoria se pueden guardar dentro de otras variables para su uso posterior: Los Punteros. Un puntero se define con el operador * y el tipo de variable a la que apunta.
inti; int*pi; pi=&i;//Punteroaladireccindei. i=33;//Valordei. *pi=55;//Contenidodeloqueapuntapi //Atentoscon: inta,b,c;//Ok int*pa,pb,pc;//NoOK.Solopaespuntero. int*p1; int*p2;//Ok. 6684160 DIRpi

33
6684160

i pi

11

12.1Repaso
Conceptos POO
inti; i=33; cout<<i; ClaseEnterosmi_entero; mi_entero.asignar(33); mi_entero.imprime_lo_que_vales();

Todo es un Objeto: Un objeto es como una variable mejorada. Cogemos un componente conceptual de nuestro problema y lo representamos como un objeto en nuestro programa (perro, edificio, tuerca, ventana,...) Los objetos se comunican mediante mensajes: Haremos programas que sern grupos de objetos enviando mensajes a otros para decirles qu hacer. Peticin de invocacin a una funcin que pertenece a un objeto en particular. Datos Propios: Podemos crear un nuevo tipo de objeto haciendo un paquete con otros objetos. Oculto la complejidad. Coche (ruedas, motor,etc) Cada objeto es de un tipo: Un clase define el tipo de un objeto. Clase Enteros -> un_entero. Un objeto es una instancia de una clase determinada.

12

12.1Repaso
Conceptos POO
Todos los Objetos de un tipo en particular pueden recibir los mismos mensajes: Esto es muy potente. Nos abre un montn de posibilidades para REUTILIZAR CDIGO. Clase Figura Clase Crculo Clase Cuadrado Clase Tringulo

Un objeto del tipo o clase Crculo tambin es del tipo Figura. Est garantizado que un crculo recibir los mensajes de Figura. Si hacemos cdigo que habla con objetos de tipo Figura, SIN TOCAR NADA, ese cdigo tambin funciona con objetos de la clase Crculo.
mi_figura.dibujar_en_pantalla(); 13

12.1Repaso
Tipos de Acceso public private protected La declaracin friend nos permite que otros accedan a nuestros datos protegidos
classX { private: inti; public: voidinitialize(); friendvoidg(X*,int); friendvoidY::f(X*); friendclassZ; friendvoidh(); }; //Globalfriend //UnmtododelaclaseY //TodaZesmiamiga

14

12.1Repaso
Relaciones de Amistad
Si A -> B y B -> C Si A -> B Si A -> B y b <<B NO A->C NO B->A NO A->b (b es el hijo de B)

Podemos definir relaciones de amistas con una funcin, con un mtodo de otra clase o con una clase entera. Friend = Puedes acceder a mis atributos privados como si fueras uno de mis mtodos

friendvoidg(X*,int); friendvoidY::f(X*); friendclassZ; friendvoidh();

//Globalfriend //UnmtododelaclaseY //TodaZesmiamiga

15

12.1Repaso
Constructores
Modo simplificado de inicializacin: int i(0); Alumno Inicializadores:
pareja::pareja(int a, int b) //Esmsseguroyeficienteas: { pareja::pareja(inta,intb):a_(a),b_(b){} a_=a; b_=b; }

a(Pepe);

classPareja { ... //Constructores Pareja(inta,intb); Pareja():a_(0),b_(0){}; ....

classPareja { ... //Argumentospordefecto Pareja(inta=0,intb=0):a_(0),b_(0){}; .... 16

12.1Repaso
Constructores por defecto
Es un constructor que puede ser invocado sin argumentos
classX { inti_; charc_; public: X(inti,charc):i_(i),c_(c){} }; Xx1[10];//ElCompiladorsevaaquejar!! Xx3;

El constructor por defecto es tan importante que si (y slo si) una clase no tiene constructor el compilador crea uno automticamente (no hace nada).
classV{ inti;//private };//Noconstructor Vv,v2[10];//Estofunciona!!

17

12.1Repaso
Referencias
1. Cuando una referencia se crea, se ha de inicializar. (Los punteros pueden inicializarse en cualquier momento.) 2. Una vez una referencia se inicializa ligndola a un objeto, no se puede ligar a otro objeto. (Los punteros se pueden apuntar a otro objeto en cualquier momento.) 3. No se pueden tener referencias con valor nulo. Siempre ha de suponer que una referencia est conectada a una trozo de memoria ya asignada.
inty; int&r=y; //Laasignamosaalgoqueyaexiste constint&q=12;//Tambinsepuedehaceresto. intx=0; int&a=x; intmain() { cout<<"x="<<x<<",a="<<a<<endl; a++; cout<<"x="<<x<<",a="<<a<<endl; } //xyasonlomismo

18

12.1Repaso
El constructor Copia
Para evitar que el compilador haga una copia bit a bit, construimos nuestro funcin de copia. Como estamos creando un objeto esta funcin tiene que ser un cosntructor, y el nico argumento tiene que ver con el objeto del que partimos para crear el nuevo. X(X&) Si creamos un constructor copia el compilador no realizar una copia bit a bit cuando cree un nuevo objeto de otro existente. Siempre se llamar al constructor copia que hemos creado.

19

12.1Repaso
Utilizacin de Nombres en la sobrecarga de funciones
Podemos utilizar el mismo nombre siempre que la lista de argumentos sea diferente. El compilador utiliza: Nombre de la funcin mbito Lista de argumentos Esto no es sobrecarga. Son funciones diferentes por el mbito: void f(); class X { void f(); }; No tenemos sobrecarga en el valor de retorno. void f(); int f(); Por qu?..............
20

12.1Repaso
Sobrecarga de Funciones
No deberamos utilizar argumentos por defecto si hay que incluir una condicin en el cdigo (un if). En este caso es mejor tener varias funciones sobrecargadas. Uso tpico de argumentos por defecto es cuando empieza con una funcin con un conjunto de argumentos, y despus de utilizarla por un tiempo se da cuenta de que necesita aadir ms argumentos. f (int a); f(int a, int b=0); // Es compatible con lo anterior.

Tanto la sobrecarga de funciones como el uso de argumentos por defecto nos hacen ms fciles las llamadas a las funciones y adems son ms fciles de leer.

21

12.1Repaso
Inicializacin y Limpieza de Objetos
El constructor es una funcin sin tipo de retorno y con el mismo nombre que la estructura. Alumno() El destructor tiene la misma forma, salvo que el nombre va precedido el operador "~". ~Alumno() Lo definimos cuando hay punteros El constructor copia tiene este aspecto: Alumno(const Alumno& a) Si creamos un constructor copia el compilador no realizar una copia bit a bit cuando cree un nuevo objeto de otro existente. Las referencias necesitan un rea de memoria que referenciar: int& x = 1; // Mal

const int& y = 1; // Bien


22

12.1Repaso
Objetos y Mtodos Constantes
classX { inti_; public: X(inti); intf()const; }; X::X(inti):i_(i){} intX::f()const{returni_;} intmain() { Xx1(10); constXx2(20); x1.f(); x2.f(); }

La palabra const debe incluirse tanto en la declaracin como en la denicin del mtodo. Como f() es un mtodo constante, si intenta modificar de alguna forma o llamar a otro mtodo que no sea constante, el compilador informar de un error. Un miembro constante puede llamarse tanto desde objetos constantes como desde no constantes de forma segura. Un mtodo que no modifica ningn atributo se debera escribir como constante y as se podra usar desde objetos constantes.
23

12.1Repaso
Constantes
La palabra reservada para definir constantes es const const nos permite definir como constantes: Variables. Objetos. Argumentos de funciones. Punteros. Mtodos. Elimina el uso de constantes simblicas con 'define' para sustitucin de valores por el preprocesador sin perder sus ventajas, aadiendo comprobacin de tipos y haciendo nuestro cdigo ms seguro. El uso de la llamada constancia exacta (const correctness) es decir, el uso de const en todo lugar donde sea posible, puede ser un salvavidas para muchos proyectos.
24

12.1Repaso
const
El motivo unicial para usar const fue para eliminar el uso de la directiva de compilacin #define para sustitucin de valores. Tiene ventajas sobre #define.
constfloatnota_esperada=8; contintcantidad=19; Alumnoscurso[cantidad]; #defineNOTA_ESPERADA8

Punteros constantes:
// p es un puntero que apunta // a:unenteroconstante. constint*p; constint*p; //wesunpunteroconstante //queapuntaa:unentero. inti=3; int*constw=&i; *w=2;//Estbienoestmal?

En C++ lo mejor es utilizar una referencia constante en lugar de paso por valor. Un mtodo que no modifica ningn atributo se debera escribir como constante y as se podra usar desde objetos constantes.
25

12.1Repaso
funciones inline
Sustituye la utilizacin de macros que es muy comn en la programacin en C. Se pens para dotar al lenguaje C++ de mayor eficiencia. Es una sugerencia para el compilador. Hay dos maneras de definir un mtodo de una clase como inline. Es preferible la que se utiliza en la implementacin y no en la declaracin de la clase.

26

12.2Repaso
Espacios de Nombres
#include<iostream> namespaceuno{ intx; } namespacedos{ intx; } usingnamespaceuno; intmain(){ x=10; dos::x=30; std::cout<<x<<","<<dos::x<<std::endl; std::cin.get(); return0; }

27

11.3Resumen
Static
Podemos controlar el almacenamiento de nuestros objetos y variables. Podemos controlar el mbito en el que se ven.

Espacios de Nombres
Utilzamos la palabra reservada namespace. Nos ayudan a dividir el espacio de nombres global de forma que podamos repetir nombres de funciones, clases y variables. Es una declaracin y se suele utilizar por tanto en los ficheros de cabecera.

28

You might also like