You are on page 1of 31

Segunda Ses i n

Metodologas y Tcnicas de Programacin II


Programacin Orientada a Objeto (POO)
C++
Profesor:
.odri*o Iaranjo B.
ssco2000@*mail.com
aboratorios:
.odri*o Iaranjo B.
ssco2000@*mail.com
+odeblocks 10.05
%
2. 0 Es t ado del Pr ogr ama
&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 "/0
Punteros 1 Memoria +ontrol 1 (-eradores
+lases 1 (bjetos en +,,
2so 1 a-licaci'n $unciones 3mi*as
+onstructores +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
2. 1 Repas o de c l as es ant er i or es .
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.
odo es un (bjeto:
: 2n objeto es como una @ariable mejorada.
: 2n objeto es una instancia de una clase determinada.
Los objetos se comunican mediante mensajes:
: Los -ro*ramas sern *ru-os de objetos en@indose
mensajes entre sA.
+aracterAsticas:
: 3bstracci'n : )erencia
: "nca-sulaci'n : Polimor8ismo
+,,:
: Len*ua*e de Pro-'sito Beneral
: Len*uaje (rientado a (bjeto.
: "8iciente 1 ele*ante
: C.000.000 -ro*ramadores ;se usa<
C
3lumno
- nombre_: string
- apellido1_: string
- apellido2_: string
- dni_: string
- edad_: int
+ 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 Or gani z ac i n de Fi c her os
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 +,,
F
.ectan*ulo
Rectangulo.h
Rectangulo.cpp
test_Rectangulo.h
2. 2 Or gani z ac i n de Fi c her os

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<.
G
.ectan*ulo
Rectangulo.h
Rectangulo.cpp
test_Rectangulo.cpp
2. 2 Or gani z ac i n de Fi c her os

"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
6
2. 2 Or gani z ac i n de Fi c her os

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
K
2. 2 Or gani z ac i n de Fi c her os

!
2. 2 Or gani z ac i n de Fi c her os
$icEeros de la +lase .ectan*ulo:
: 6er 8icEeros con el c'di*o 8uente
L
.ectan*ulo
- altura_: int
- anchura_: int
+ inicializar()
+ altura(): int
+ anchura(): int
+ area(): int
+ altura(int)
+ anchura(int)
2. 3 Es t ndar es
Iombres de +lases> (bjetos> atributos 1 mtodos J &nde#ado 1 corcEetes
%0
class Rectangulo
{
private:
int altura_;
int anchura_;
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;
}
}
int main(void)
{
Rectangulo mi_rectangulo;
Rectangulo rectangulo_ejemplo;
Rectangulo* p_rec;
............
return 0;
}
2. 3 Es t ndar es
+abeceras de los $icEeros:
"n las declaraciones de las +lases:
%%
/**
* @file test_Rectangulo.cpp
* @brief Pruebas sobre la clase Rectangulo. Ejemplo Metodos II
*
* @author Jose Luis Marina <jlmarina@nebrija.es>
* @date 19-FEB-2007
*/
/**
* @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 Es t ndar es
+omentarios de documentaci'n de atributos 1 metodos:
"n los 8icEeros de cabecera ?ue incluir en resto ;Hinclude<:
%2
/// Altura del rectangulo en metros
int altura_; // Comentario sobre la altura.
/**
* 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 que el valor sea positivo.
* @param alto Anchura en metros.
*/
void altura(int alto);
#ifndef RECTANGULO_H
#define RECTANGULO_H
... cdigo ......
#endif /* RECTANGULO_H */
2. 3 Es t ndar es
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 Pr ogr amac i n Es t r uc t ur ada
$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); // Correcto. La preferimos.
int translate(float , float , float ); // Correcto.
int translate(float x,y,z); // Incorrecto
void funcion(void) ; // Sin argumentos. Equivalente a void funcion()
&m-lementaci'n:
int translate(float x, float y, float z) // Correcto
{
x = y = z;
}
int translate(float , float , float ) // Incorrecto.
{
}
%F
2. 4 Pr ogr amac i n Es t r uc t ur ada
$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;
} %G
int main() {
cout << "Introduzca un entero: ";
int val;
cin >> val;
cout << cfunc(val) << endl;
}
2. 4 Pr ogr amac i n Es t r uc t ur ada
$unciones: 2so de 8unciones en librerAas
enemos ?ue incluir su declaraci'n con include
#include <iostream.h> // Librera de entrada salida.
#include <mathlib.h> // Librera con funciones matemticas.
#include lib_trigonometrica.h // En path de proyecto o local.
.............
cout << Estoy usando iostream << endl;
x = sqtr(9); // mathlib
y = funcion_coseno(180); // librera de funciones trigonometricas.
.............
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 Pr ogr amac i n Es t r uc t ur ada
+ontrol de $lujo: &8
iene dos 8ormas:
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
if (expresion)
sentencia
else
sentencia
2. 4 Pr ogr amac i n Es t r uc t ur ada
+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 Pr ogr amac i n Es t r uc t ur ada
+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 Pr ogr amac i n Es t r uc t ur ada
+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 Pr ogr amac i n Es t r uc t ur ada
+ontrol de $lujo: sPitcE
6iene a ser un if anidado con una estructura ms le*ible. Mu1 usado.
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%
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;
}
}
2. 4 Pr ogr amac i n Es t r uc t ur ada
(-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 Pr ogr amac i n Es t r uc t ur ada
(-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
if ((i < j) && ((a == 5) || (a == 10)) ...
2C
2. 4 Pr ogr amac i n Es t r uc t ur ada
(-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 Pr ogr amac i n Es t r uc t ur ada
"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 Pr ogr amac i n Es t r uc t ur ada
(-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; // Maximo valor= 32767
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);
26
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);
2. 4 Pr ogr amac i n Es t r uc t ur ada
(-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 Pr ogr amac i n Es t r uc t ur ada
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 Pr ogr amac i n Es t r uc t ur ada
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 (-32768)
# define SHRT_MAX 32767
/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */
# define USHRT_MAX 65535
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
2L
2. 4 Pr ogr amac i n Es t r uc t ur ada
i-os de Datos: Bsicos
char Para almacenar caracteres 8 bits (un byte)
int Nmero entero 16 bits (2 bytes)
float Nmero coma flotante precisin simple utilizar sizeof
double Nmero coma flotante precisin doble 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 Pr ogr amac i n Es t r uc t ur ada
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
C%
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.

You might also like