Está en la página 1de 31

Segunda Sesin

Metodologas y Tcnicas de Programacin II Programacin Orientada a Objeto (POO) C++ Profesor:


Jos Luis Marina jmarina@nebrija.es

aboratorios:

Jos Luis Marina jmarina@nebrija.es Borland Builder 6.0 "#$ 20% !0% %&$ '&$ ,#$
%

P!nt!acin:

Prcticas Laboratorio: Diarias rabajo Laboratorio "#men Parcial "#men $inal ()*men +inal ()traordinario

2.0 Estado del Programa


&ntroducci'n a la P((
)istoria de la Pro*ramaci'n +once-tos de P(( +,, Mi -rimera +lase

.e-aso de +once-tos

"stndares de Pro*ramaci'n Punteros 1 Memoria

"/0 +ontrol 1 (-eradores

+lases 1 (bjetos en +,,


2so 1 a-licaci'n +onstructores

$unciones 3mi*as +onstantes e 4inline5

0obrecar*a
De (-eradores De $unciones

)erencia.

i-os de 6isibilidad

)erencia M7lti-le

Polimor8ismo
$unciones 6irtuales Polimor8ismo 1 0obrecar*a.

Plantillas

+ontenedores

&teradores

2.1 Repaso de clases anteriores.


Buscamos la .eutili9aci'n 0istemtica : ;P((< =ueremos escribir s'lo el c'di*o necesario> e?ui@ocarnos menos> -oner 1 ?uitar 8uncionalidad de 8orma 8cil. 3lumno odo es un (bjeto: - nombre_: string : 2n objeto es como una @ariable mejorada. - apellido1_: string : 2n objeto es una instancia de una clase determinada. - apellido2_: string Los objetos se comunican mediante mensajes: - dni_: string : Los -ro*ramas sern *ru-os de objetos en@indose - edad_: int mensajes entre sA. +aracterAsticas: : 3bstracci'n : "nca-sulaci'n +,,: : Len*ua*e de Pro-'sito Beneral : Len*uaje (rientado a (bjeto. : "8iciente 1 ele*ante : C.000.000 -ro*ramadores ;se usa< : )erencia : Polimor8ismo
+ + + + + + + + + + nombre(string nom) apellido1(string a1) apellido2(string a2) dni(string dni) edad(int anios) nombre() : string apellido1() : string apellido2() : string dni() : string edad(): int

2.2 Organizacin de Ficheros


nombreDclase.E contiene la de8inici'n de la clase. nombreDclase.c-- contiene la de8inici'n de las 8unciones 1 o-eradores de la clase. -ro*rama.c-- contiene un -ro*rama -rinci-al con al*unas acciones sobre la clase. (r*ani9aci'n bastante Eabitual en +,,
Rectangulo.h

.ectan*ulo
Rectangulo.cpp

test_Rectangulo.h

2.2 Organizacin de Ficheros

Los usuarios de la clase tienen acceso al header o 8icEero de cabecera o 8icEero de declaraci'n;nombreDclase.E< La de8inici'n de las 8unciones 1 o-eradores ;im-lementaci'n de la clase< se Eace en otro 8icEero 8uente al cual no es necesario acceder. Los detalles de este c'di*o -ueden ?uedar ocultos al usuario ;cliente< de la clase . Me -ueden dar acceso al 4.E5 1 en lu*ar del 4.c--5 al c'di*o objeto *enerado ;4.o5> 4.obj5> 4.lib5. 4.dll5<.

Rectangulo.h

.ectan*ulo
Rectangulo.cpp

test_Rectangulo.cpp

2.2 Organizacin de Ficheros

"l 8icEero nombreDclase.E se encierra en el si*uiente c'di*o de -re-rocesador: #ifndef NOMBRE_CLASE_H #define NOMBRE_CLASE_H ... #endif Las directi@as de -re-rocesador anteriores e@itan ?ue el c'di*o entre Hi8nde8 1 Hendi8 sea incluido si se Ea de8inido el nombre I(MB."D+L30"D)> es decir> si el encabe9ado Ea sido incluido -re@iamente en al*7n otro arcEi@o. La inclusi'n ;inad@ertida< del mismo arcEi@o sucede -or lo *eneral en -ro*ramas *randes con mucEos arcEi@os de cabecera

2.2 Organizacin de Ficheros

Podemos tener G0 clases en nuestro -ro*rama ?ue J recordemos J nos a1udan a @er mejor el -roblema ?ue tratamos de solucionar. "stas clases estarn en G0 8icEeros de cabecera 1 G0 de im-lementaci'n. 2nas clases Earn uso de otras ;cocEe 1 motor: +ocEe inclu1e Motor.E<

=ueremos +laridad 1 -oder .eutili9ar

2.2 Organizacin de Ficheros

2.2 Organizacin de Ficheros


$icEeros de la +lase .ectan*ulo: : 6er 8icEeros con el c'di*o 8uente

.ectan*ulo
- altura_: int - anchura_: int + + + + inicializar() altura(): int anchura(): int area(): int

+ altura(int) + anchura(int)

2.3 Estndares
Iombres de +lases> (bjetos> atributos 1 mtodos J &nde#ado 1 corcEetes
class Rectangulo { private: int int altura_; anchura_; Rectangulo* p_rec; ............ return 0; } int main(void) { Rectangulo mi_rectangulo; Rectangulo rectangulo_ejemplo;

public: void inicializar(void); int altura(void); int area(void); void altura(int alto); };

// ----------------------------------------------------------------------------void Rectangulo::altura(int alto) { if (alto > 0) { altura_ = alto; } else { altura_ = -1; } } %0

2.3 Estndares
+abeceras de los $icEeros:
/** * * * * * */ @author @date Jose Luis Marina <jlmarina@nebrija.es> 19-FEB-2007 @file @brief test_Rectangulo.cpp Pruebas sobre la clase Rectangulo. Ejemplo Metodos II

"n las declaraciones de las +lases:


/** * @class Rectangulo * * @brief Clase Rectangulo para ejemplo de uso de estndares en Metodos II * * Podremos utilizar esta clase mas adelante para mostrar herencia y * polimorfismo. */

%%

2.3 Estndares
+omentarios de documentaci'n de atributos 1 metodos:
/// Altura del rectangulo en metros int /** * Devuelve el valor del area. * @retval Area en metros cuadrados y -1 en caso de error. */ int area(void); /** * Asigna valor a la altura del rectangulo. * Comprueba */ void altura(int alto); que el valor sea positivo. Anchura en metros. * @param alto altura_; // Comentario sobre la altura.

"n los 8icEeros de cabecera ?ue incluir en resto ;Hinclude<:


#ifndef RECTANGULO_H #define RECTANGULO_H ... cdigo ...... #endif /* RECTANGULO_H */

%2

2.3 Estndares
6entajas de los "stndares
31udan a .eutili9ar el c'di*o "l c'di*o reali9ado -or dos -ro*ramadores 4se -arece5. "s ms 8cil ?ue entendamos el c'di*o del otro 1 lo Earemos de 8orma ms r-ida. $acilitan la Documentaci'n Documentar un sistema -ara ?ue otros lo entiendan ;o 1o mismo dentro de un tiem-o< es -arte de la tarea de -ro*ramaci'n. 2n c'di*o incom-rensible es -oco: : Mantenible : 3m-liable : .eutili9able +ambios en los "stndares 0A> -ero de manera consensuada 1 a@isando al resto. ;M< 6er ejem-lo Do#1*en 1 .ectn*ulo
%C

2.4 Programacin Estructurada


$unciones
"nca-sulan la com-lejidad en -ro*ramaci'n -rocedimental. 0e-aramos la declaraci'n de la im-lementaci'n. Declaraci'n:
int translate(float x, float y, float z); int translate(float , float , float ); int translate(float x,y,z); // Correcto. La preferimos. // Correcto. // Incorrecto

void funcion(void) ; // Sin argumentos. Equivalente a void funcion()

&m-lementaci'n:
int translate(float x, float y, float z) { x = y = z; } int translate(float , float , float ) { } // Incorrecto. // Correcto

%F

2.4 Programacin Estructurada


$unciones: 6alores de .etorno
0e debe es-eci8icar el ti-o del @alor de@uelto. 0i no de@ol@emos nada utili9amos void. Declaraci'n:
int int f1(void); // Devuelve un entero, no tiene argumentos int f2(); // igual que f1() en C++ pero no en C Stantard float f3(float, int, char, double); // Devuelve un float void f4(void); // No toma argumentos, no devuelve nada

Para de@ol@er @alores usamos return


char cfunc(int i) { if(i == 0) return a; if(i == 1) return g; if(i == 5) return z; return c; } } int main() { cout << "Introduzca un entero: "; int val; cin >> val; cout << cfunc(val) << endl;

%G

2.4 Programacin Estructurada


$unciones: 2so de 8unciones en librerAas
enemos ?ue incluir su declaraci'n con include
#include <iostream.h> #include <mathlib.h> ............. cout << Estoy usando iostream << endl; x = sqtr(9); ............. // mathlib y = funcion_coseno(180); // librera de funciones trigonometricas. // Librera de entrada salida. // Librera con funciones matemticas.

#include lib_trigonometrica.h // En path de proyecto o local.

3dems con nuestro c'di*o se enla9ar el c'di*o objeto adecuado: .lib .a .o :N "nla9ado esttico .dll .so :N Dinmico
%6

2.4 Programacin Estructurada


+ontrol de $lujo: &8
iene dos 8ormas:
if (expresion) sentencia else sentencia if (expresion) sentencia

"#-resi'n se e@al7a como true o false. $alse es e?ui@alente a 0 1 true a IoDcero.


cout << "type a number and Enter" << endl; cin >> i; if(i < 10) if(i > 5) // "if" is just another statement cout << "5 < i < 10" << endl; else // A que if pertenece este else? cout << "i <= 5" << endl; else // Matches "if(i < 10)" cout << "i >= 10" << endl

%K

2.4 Programacin Estructurada


+ontrol de $lujo: OEile
"n los bucles de control PEile> do:PEile> 1 8or> una sentencia se re-ite Easta ?ue la e#-resi'n de control sea false.
while(expresion) sentencia

La e#-resi'n se e@alua una @e9 al comien9o del bucle 1 cada @e9 antes de cada iteraci'n de la sentencia
int main() { int secreto = 15; int apuesta = 0; // "!=" Diferente de while(guess != secret) { cout << "Adivina el numero: "; cin >> apuesta; } cout << "Lo adivinaste!" << endl; }

%!

2.4 Programacin Estructurada


+ontrol de $lujo: do:PEile
"l do-while es di8erente del while 1a ?ue la sentencia siem-re se ejecuta al menos una @e9> aun si la e#-resi'n resulta false la -rimera @e9. "n un while normal> si la condici'n es 8alsa la -rimera @e9> la sentencia no se ejecuta nunca.
int main() { int secreto = 15; int apuesta; // No hace falta inicializar porque ejecutamos el bucle. do { cout << "Adivina el numero: "; cin >> apuesta; // Se inicializa aqui. } } while(apuesta != secreto); cout << "Lo adivinaste!!" << endl;

%L

2.4 Programacin Estructurada


+ontrol de $lujo: 8or
2n bucle for reali9a una iniciali9aci'n antes de la -rimera iteraci'n Lue*o ejecuta una e@aluaci'n condicional 1> al 8inal de cada iteraci'n> e8ect7a al*7n ti-o de 4si*uiente -aso5. La estructura del bucle for es:
for(initializacion; condicional; paso) sentencia int main() { for(int i = 0; i < 128; i = i + 1) { if (i != 26) // ANSI Limpiar pantalla cout << " value: " << i << " character: " << char(i) // Conversion de entero a al carcter ASCII << endl; } }

20

2.4 Programacin Estructurada


+ontrol de $lujo: sPitcE
6iene a ser un if anidado con una estructura ms le*ible. Mu1 usado.
int salir = 0; while(!salir) { cout << "Select a, b, c or q to quit: "; char response; cin >> response; switch(response) { case a : cout << "you chose a" << endl; break; case q : cout << "quitting menu" << endl; quit = true; break; default : cout << "Please use a or q!" << endl; } } switch(selector) { case valor-entero1 : sentencia; break; case valor-entero2 : sentencia; break; case valor-entero3 : sentencia; break; case valor-entero4 : sentencia; break; case valor-entero5 : sentencia; break; (...) default: sentencia; }

2%

2.4 Programacin Estructurada


(-eradores
2n o-erador se -uede @er como un ti-o es-ecial de 8unci'n. 2n o-erador recibe uno o ms ar*umentos 1 de@uel@e un nue@o @alor. Los ar*umentos se -asan de 8orma di8erente. "l @alor es -roducido sin modi8icar los o-erandos e#ce-to con los o-eradores de asi*naci'n ;Q<> incremento ;,,< 1 decremento ;::<

Precedencia
"n una misma sentencia -uedo utili9ar @arios o-eradores: A = X + Y - 2/2 + Z; +omo re*la *eneral: : La multi-licaci'n 1 la di@isi'n se ejecutan antes ?ue la suma 1 la resta. : 0i no se entiende bien usa los -arntesis. A = X + (Y - 2)/(2 + Z);
22

2.4 Programacin Estructurada


(-eradores matemticos
3dici'n :, 0ustracci'n :: Multi-licaci'n :M Di@isi'n :/ .esto : % ;.esto de di@isi'n entera %K%C es 2< +,, -ermite # Q # ,CR ' # ,Q CR

(-eradores .elacionales
Menor ?ue :S Ma1or ?ue :N Menor o i*ual ?ue : SQ Ma1or o i*ual ?ue : NQ "?ui@alente : QQ Io e?ui@alente : TQ 0e -ueden utili9ar -ara todos los ti-os -rede8inidos de +,,. Podemos de8inir su com-ortamiento -ara ti-os o clases creadas -or nosotros. "sto es sobrecar*a de o-eradores. if (rectangulo_a == rectangulo_b) ...

(-eradores L'*icos
3ID : UU (. : VV
2C

if ((i < j) && ((a == 5) || (a == 10)) ...

2.4 Programacin Estructurada


(-eradores -ara bits
3ID :U Produce % en la salida si ambos o-eradores son %. "n otro caso 0. (. :V Produce 0 en la salida si ambos o-eradores son 0. "n otro caso %. W(. :X Produce % en la salida si solo un o-erador es %. "n otro caso 0. I( :Y Des-la9amiento : NN derecEa SS i9?uierda

(-eradores 2narios
Iot :: "l ms unario no Eace nada ; # Q ;,a<< &ncremento : ,, Decremento : :: +uidado con los -unterosTT Direcci'n de :U De8erencia : M 1 :N
2F

2.4 Programacin Estructurada


"l (-erador ernario
"s @erdaderamente un o-erador -or?ue -roduce un @alor> al contrario de la sentencia ordinaria i8:else. <expresion1> ? <expresion2> : <expresion3>; a = --b ? b : (b = -99); Primero decrementa b. Si b decrementado es distinto de cero a = b; Si b decrementado es cero b = -99; a = (b = -99) -> true (1)

"l (-erador coma


3dems de se-arar nombres de @ariables en las listas de ar*umentos de 8unciones -uede utili9arse como o-erador -ara se-arar e#-resiones. Mejor lo utilizamos slo para separar. Poco utilizado.
2G

2.4 Programacin Estructurada


(-eradores de cambio de ti-o. Casting o Moldeado
"l conce-to es 4+olocamos en un molde de un entero un lon*5. "l com-ilador cambiar automticamente de un ti-o a otro si esto tiene sentido. &nsertar una 8unci'n ?ue Eace el cambio de un ti-o de datos al otro ti-o. )a1 ?ue utili9arlo con mucEo cuidado 1 en -ocas ocasiones. Io tiene sentido cambiar de 8loat a int constantementeR se*uramente Eabr ?ue re@isar el diseZo de las estructuras de datos.
int i = 0x7fff; // long l; float f; l = i; // Sin necesidad de cast f = i; // Sin necesidad de cast // Tambin funciona l = static_cast<long>(i); f = static_cast<float>(i); Maximo valor= 32767 i = l; // Posible perdida de digitos i = f; // Posible perdida info, i = static_cast<int>(l);// no warning i = static_cast<int>(f);// no warning char c = static_cast<char>(i);

26

2.4 Programacin Estructurada


(-erador sizeof
sizeof da in8ormaci'n acerca de la cantidad de memoria utili9ada -ara los datos. Puede darnos: : el n7mero de b1tes utili9ado -or una @ariable. : el n7mero de b1tes utili9ado -or un ti-o de datos. "s un o-erador> no una 8unci'n> 1 en el caso de una @ariable -uede usarse sin -arntesis.
#include <iostream> using namespace std; int main(void) { cout << "sizeof(double) = " << sizeof(double); cout << ", sizeof(char) = " << sizeof(char) << endl; int x; int i = sizeof x; }

2K

2.4 Programacin Estructurada


i-os de Datos
Los ti-os de datos de8inen el modo en ?ue se usa el es-acio ;memoria< en los -ro*ramas. "s-eci8icando un ti-o de datos> estamos indicando al com-ilador como crear un es-acio de almacenamiento en -articular> 1 tambin como mani-ular este es-acio. Ti-o de dato Predefinido: "s intrAnsecamente com-rendido -or el com-ilador. "stos ti-os de datos son casi idnticos en + 1 +,,. Ti-o de dato definido -or el !s!ario: ambin se les llama ti-os de datos abstractos 1 son -or ejem-lo las clases. "l com-ilador a-rende a manejar estos ti-os de datos le1endo los 8icEeros ?ue contienen las declaraciones de las clases.

2!

2.4 Programacin Estructurada


i-os de Datos: Bsicos
Los @alores m#imo 1 mAnimo ?ue -ueden alber*ar los distintos ti-os de datos -rede8inidos se de8inen en los 8icEeros de cabecera de sistema limits.h y float.h
#ifndef _LIBC_LIMITS_H_ #define _LIBC_LIMITS_H_ 1 /* Minimum and maximum values a `signed short int' can hold. # # define SHRT_MIN define SHRT_MAX (-32768) 32767 (Minimum is 0.) */ */

/* Maximum value an `unsigned short int' can hold. # define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold. # # define INT_MIN define INT_MAX (-INT_MAX - 1) 2147483647

*/

/* Maximum value an `unsigned int' can hold. # define UINT_MAX 4294967295U

(Minimum is 0.)

*/

2L

2.4 Programacin Estructurada


i-os de Datos: Bsicos
char int float double Para almacenar caracteres Nmero entero Nmero coma flotante precisin simple Nmero coma flotante precisin doble 8 bits (un byte) 16 bits (2 bytes) utilizar sizeof utilizar sizeof.

0e -ueden de8inir @ariables en cual?uier sitio en un mbito determinado> 1 -odemos de8inirlas e iniciali9arlas al mismo tiem-o.
// Solo definicion: char proteina; int carbohidratos; float fibra; double grasa; // Definicion e inicializacion: char pizza = A, palomitas = Z; int ganchitos = 100, almendras = 150, pipas = 200; float chocolate = 3.14159; // Notacin exponencial: double hamburgesa = 6e-4; // Seis por diez elevado a cuatro

C0

2.4 Programacin Estructurada


i-os de Datos: "s-eci8icadores
long y s.ort : Modi8ican m#imos 1 mAnimos. signed y !nsigned : +omo utili9ar el bit de si*no en enteros 1 caracteres. Para enteros: sEort int> int > lon* int Pueden ser del mismo tamaZo si satis8acen mAnimos 1 m#imos. 0i la -alabra del sistema es de 6F bits todos -ueden ser de 6F bits. Para n7meros en coma 8lotante: [oat> double 1 lon* double. 4lon* [oat5
char c; unsigned char cu; int i; unsigned int iu; short int is; short iis; // Lo mismo que short int unsigned short int isu; unsigned short iisu; long iil; // Igual que long int long float; // No valido. long double ld; unsigned float ff; // No valido.

C%

También podría gustarte