cap%c3%8 dtulo+1+programacion+orientada+a+objetos

66
Programación Orientada a Objetos (POO) Abel Federico Pérez Hernández

Upload: cinthi11

Post on 13-Jun-2015

1.025 views

Category:

Documents


1 download

DESCRIPTION

programacion orientada a objetos

TRANSCRIPT

Page 1: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Programación Orientada a Objetos (POO)

Abel Federico Pérez Hernández

Page 2: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 2

Programas pequeños

Código espaguettien programas demiles de líneas

Años 50s

Años 60s y 70s

LenguajeEnsamblador

LenguajeFORTRAN

Programaciónestructurada

Programas estructurados: se basan en estructuras de control (secuencia, condicional e iteración), uso mínimo de GOTO y subrutinas independientes quesoportan recursividad y variables locales, e.g. Algol y PascalProgramas mayores

de 50,000 líneas

Introducción

Page 3: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 3

Programación Orientada a Objetos(POO)

� Objetivo: permitir al desarrollador realizar programas

más fáciles de escribir, de mantener y de reutilizar.

� Expresa un programa en términos de un conjunto de

objetos que colaboran entre si para realizar tareas.

Calcular

mediao1

o2

o3

o1

Programa

Page 4: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 4

Programación Orientada a Objetos(POO)

� La POO es una evolución de la PE que plasma en el

diseño de una familia de lenguajes conceptos que existíanpreviamente con algunos nuevos.

� La POO se basa en lenguajes que soportan sintáctica y semánticamente la unión entre tipos de datos abstractos y sus operaciones (clase).

� La POO incorpora en su entorno de ejecución mecanismo

como el polimorfismo y el envío de mensajes entreobjetos.

Page 5: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 5

Programación Orientada a Objetos

(POO)

� Un objeto está formado de datos y

procedimientos relacionados.

� El programador piensa en términos de objetos.

� Primero definen objetos para luego enviarles

mensajes solicitándoles que ejecuten sus

métodos por si mismos.

Page 6: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 6

Conceptos de la POO

� Objeto: entidad provista de:

� estado, i.e. propiedades externas e internas

� comportamiento, i.e. métodos

� identidad, i.e. propiedad que lo diferencía del

resto

� Clase: definiciones del estado y del comportamiento de un tipo de objeto concreto.

� Instanciación: lectura de las definiciones de una clase y la creación de un objeto a partir de ellas.

Page 7: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 7

Conceptos de la POO

� Método: algoritmo asociado a un objeto (o clase de

objetos), cuya ejecución se desencadena tras la

recepción de un mensaje.

Un mensaje puede producir:

� Un cambio en las propiedades del objeto o

� La generación de un nuevo mensaje que será

enviado a otro objeto

� Mensaje: una comunicación dirigida a un objeto que le ordena que ejecute uno de sus métodos.

Page 8: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 8

Conceptos de la POO

� Propiedad externa: contenedor de un tipo de datos

asociado a un objeto (o clase de objetos):

� Permite que los datos sean visibles desde el exterior del objeto

� Su valor puede ser alterado por algún método

� Propiedad interna: estado invisible de los objetos, que

únicamente puede ser accedido por un método del objeto.

Page 9: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 9

Mecanismo de encapsulación

� Definición: permite reunir todos los elementos que pueden considerarse pertenecientes a una misma

entidad, al mismo nivel de abstracción

� Aumenta la cohesión de los componentes de sistema

� Suele ser confundido con el principio de ocultamiento

nombre_Alumnocurpdirecciónteléfononombre_Cursocalificación…

Alumno

nombrecurpdirecciónteléfono…

Curso

nombrecalificación…

Page 10: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 10

Principio de ocultamiento

� Definición: mecanismo que protege datos y métodoscontra cualquier interferencia o mal uso.

Privados: sólo los conoce y son accesibles por otra parte del objeto, i.e. una parte del programa que esta fuera del objetono puede accederlos.

Públicos: otras partes del programa pueden accederlos… se utilizan para ofrecer una interfaz controlada a las partesprivadas del objeto.

propiedades

métodosObjeto

Empaquetamientomediante un LOO

Interfaz

Page 11: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 11

Ejemplo: bibliotecas “stdio.h” y “math.h”

� Encapsulación:

� Stdio contiene los prototipos de las funciones y tipos

para manipular datos de entrada y salida.

� Math contiene los prototipos de las funciones y

definiciones para el uso y manipulación de funciones

matemáticas.

� Ocultamiento:

� Si se utiliza una función de biblioteca, e.g. printf() o

cos(), se utiliza una rutina de caja negra cuya parte

interna no se puede modificar.

� Se crean e inicializan diversas variables privadas

(ocultas e inaccesibles).

Page 12: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 12

Polimorfismo

� Definición: cualidad que permite que un nombre se use

para varios propósitos relacionados, pero técnicamente

diferentes.

� En POO, el polimorfismo permite usar un nombre para

especificar una clase general de acciones.

Tipo de datoClase generalde acciones

Acciónespecífica

C++

Page 13: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 13

Ejemplo de la vida diaria

Volante de un automovil funciona igual si utilizamos:

� Dirección mecánica

� Dirección asistida

� Dirección hidráulica

Misma interfaz

Diferentesmecanismosde dirección

Page 14: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 14

Polimorfismo aplicado a funciones

� Contra ejemplo: el cálculo del valor absoluto en C

requiere tres funciones, abs(), labs() y fabs(), para

entero, entero largo y valor real, respectivamente.

� Ejemplo: C++ define la función abs() donde el tipo de

dato (e.g. entero, largo o real) utilizado para llamar la función determina que versión específica se utiliza.

abs()

Interfaz genérica(multi-métodos)

Implementación de abs()

Implementación de labs()

Implementación de fabs()

entero

entero largo

real

Page 15: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 15

Polimorfismo aplicado a funciones

Ventajas:

� Ayuda a reducir la complejidad permitiendo que

la misma interfaz se utilice para especificar una

clase general de acción.

� El compilador selecciona la acción específica

(implementación) que se aplica a cada

situación.

Page 16: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 16

Polimorfismo aplicado a operadoresaritméticos

� La mayoría de los lenguajes de programación proveenuna aplicacion limitada del polimorfismo de operadoresaritméticos:

� e.g. en lenguaje C, el signo + se utiliza paraañadir enteros, enteros largos, caracteres y reales.

� El compilador automáticamente sabe que tipo de aritmética debe aplicar.

� En C++, se puede aplicar este concepto a otros tipos de datos definidos por el usuario.

Page 17: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 17

Ejemplo de una lista

insert(i)extract(i)

Pila

insert(i)extract(i)

ColaImplementaciónLIFO

ImplementaciónFIFO

cliente

Lista

insert(i)extract(i)

� Substituir objetos con interfaces idénticas en tiempode ejecución.

� Simplificar la definición del cliente.

� Desacoplar objetos entre si.

• Mismos tipos de datos• Aplicación sobre un conjunto de métodos

Page 18: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 18

Herencia

� Definición: proceso mediante el cual un objeto puedeadquirir las propiedades de otro.

� Permite que un objeto soporte el concepto de clasificación jerárquica:

Casa

Edificio

Estructura

Obra-hombre

es parte de

+

-

General

Page 19: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 19

Herencia

� En cualquier caso, la clase hija hereda todas lascualidades asociadas con la clase padre y le añade suspropias características definitorias.

Apio

Vegetales

Plantas

Organismosvivos

es parte de

� Sin el uso de clasificaciones jerárquicas cada objetotendría que definir todas las características que se

relacionan con él explícitamente.

Page 20: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 20

Lenguajes Orientados a Objetos

� Action Script 3

� Ada

� C++

� C#

� VB.NET

� Visual FoxPro

� Clarion

� Builder C++

� Delphi

� Harbour

� Eiffel

� Java

� Lexico (en castellano)

� Objetive-C

� Ocaml

� Oz

� Perl

� PHP (versión 5)

� PowerBuilder

� Python

� Ruby

� Smalltalk

� Magik (SmallWorld)

Page 21: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 21

E/S en C++

� Es posible utilizar las funciones printf() y scanf(), pero C++ ofreceun método nuevo y mejor:

� Operador de salida <<

� Operador de entrada >>

Nota: en C y C++ << y >> también son operadores de desplazamiento (SOBRECARGA DE OPERADORES)

� Ejemplos de salida con <<:

cout << expression;

Flujo predefinido que se enlaza automáticamente con el dispositivo de salida (pantalla) en tiempo de ejecución

Page 22: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 22

E/S en C++

� Ejemplos de <<: permite mostrar cualquier tipo básico de C++

cout << “Muestra esta cadena en pantalla\n”;

cout << 100.99;

� Ejemplos de >>: permite introducir cualquier tipo básico

de C++ desde el teclado

cin >> variable;

int num;

cin >> num;

Page 23: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 23

Ejemplo #1: muestra una cadena, dos enteros y un real doble

#include <iostream.h> //Operadores de E/S

main(){int i, j; double d;i=10; j=20; d=99.101;

cout << “Estos son algunos valores: ”cout << i; cout << ‘ ‘;cout << j; cout << ‘ ‘;cout << d;

return 0; /*devolver un valor conocido al proceso de llamada (SO) en vez de un valor indefinido */

}

Page 24: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 24

Ejemplo #2: mejora del ejemplo precedente

#include <iostream.h>

main()

{

int i, j; double d;

i=10; j=20; d=99.101;

cout << “Estos son algunos valores: ”

/* Muestra más de un valor en una solaexpresión de E/S */

cout << i << ‘ ‘ << j << ‘ ‘ << d;

return 0;

}

Page 25: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 25

Ejemplo #3: pide un valor entero

#include <iostream.h>

main()

{

int i;

cout << “Introduzca un valor: ”;

cin >> i;cout << “Este es su número: ” << i <<

“\n”;

return 0;

}

Page 26: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 26

Ejemplo #4: pide un entero, un real y unacadena en una sola sentencia de entrada

#include <iostream.h>

main(){int i; float f; char s[80];

cout << “Introduzca un entero, un real y una cadena: ”;cin >> i >> f >> s;

cout << “Estos son sus datos: ”;cout << i << ‘ ‘ << f << ‘ ‘ << s;

return 0;}

Page 27: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 27

Salida del ejemplo #4

� Los elementos de datos individuales pueden separarse

mediante: espacios en blanco, tabuladores y caracteres de

nueva línea

� Entrada del programa:

10 100.12 Esto es una prueba

� Lectura de una cadena: la entrada se detendrá cuando se lea

el primer espacio en blanco

� Salida del programa:

10 100.12 Esto

� Nota: el resto de la cadena queda en un búfer de entradaesperando una operación posterior

¿Cuál es la salida?

Page 28: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 28

Salida del ejemplo #4

� Los elementos de datos individuales pueden separarsemediante: espacios en blanco, tabuladores y caracteres

de nueva línea

� Entrada del programa:

10 100.12 Esto es una prueba [ENTER]

� Lectura de una cadena: la entrada se detendrá cuando

se lea el primer espacio en blanco

� Salida del programa:

10 100.12 Esto

� Nota: el resto de la cadena queda en un búfer de entrada esperando una operación posterior

Page 29: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 29

Ejemplo #5: efecto de la entrada con buffer de línea

#include <iostream.h>main(){

char ch;

/* Por omisión, toda entrada es con búfer de línea, i.e. no se pasa ninguna información al programa C++ hasta que se pulsa ENTER */

cout << “Introduzca teclas, x para parar: \n”;

do {cout << “: ”;cin >> ch;

} while (ch != ‘x’);

return 0;}

Page 30: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 30

Comentarios en C++

� C++ propone dos formas diferentes de hacercomentarios:

� Forma #1: es posible crear comentarios en variaslíneas

/* comentario

*/

� Forma #2: sólo es posible hacer comentarios de una

línea

// comentario [retorno de carro y avance de línea]

Page 31: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 31

Ejemplo #1: combinación de comentarios en estilos C y C++

/* Este es un comentario al estilo de C. Esteprograma determina si un entero es par o impar

*/#include <iostream.h>

main () {

int num; //comentario de una línea en C++

//leer el númerocout << “Introduzca el número a probar: “;

cin >> num;

//ver si es par o imparif((num%2)==0) cout << “El número es par\n”;

else cout << “El número es impar\n”;

return 0;

}

Page 32: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 32

Ejemplo #2: anidamiento de comentarios

Los comentarios al estilo de C NO se pueden

anidar:

/* comentario

/* comentario …

*/

*/

Es posible anidar un comentario de una sola

línea de C++ dentro de un comentario de

varias líneas de C:

/* Este es un comentario de varias líneas en el

cuál // se anidó un comentario de una línea

Aquí termina el comentario de varias líneas

*/

Page 33: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 33

Clases

� Definición: mecanismo para crear objetos

Declaración

class nombre-clase {

funciones y variables privadas

public:

funciones y variables públicas

} lista de objetos;

� La lista de objetos es opcional

� nombre-clase es un nuevo nombre de tipo que se utiliza

para declarar objetos

Miembrosde la clase

Page 34: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 34

Clases

� Por omisión, todas las funciones y variables declaradas en una claseson privadas

class nombre-clase {

funciones y variables privadas

public:

funciones y variables públicas

} lista de objetos;

Accesibles porotros miembros de esta clase

Accesibles porotros miembros de esta clase y porcualquier otraparte del programa quecontenga la clase

Page 35: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 35

Ejemplo de declaración de una claseen C++

class myclass {

//privado para myclass

int a;

public:

void set_a(int num);

int get_a();

};

� Solo los miembros set_a(int num) y get_a() pueden acceder a la variable a

� Los miembros set_a(int num) y get_a() pueden ser accedidos porcualquier parte del programa

Page 36: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 36

Definición de funciones miembro

tipo nombre-clase::nombre-func(lista-parámetros)

{

...//cuerpo de la función

}

Operador de resolución del ámbito(asociación)

Page 37: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 37

Ejemplo de definición de funciones

miembro

/* set_a() y get_a() (públicos) pueden

acceder directamente a a (privado) porque

son miembros de myclass */

void myclass::set_a(int num) {

a = num;

}

int myclass::get_a() {

return a;

}

Page 38: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 38

Declaración de objetos

� La declaración de myclass no definió ningún objeto, sólo definió un tipo:

class myclass {

//privado para myclass

int a;

public:

void set_a(int num);

int get_a();

};

� Para crear un objeto, se utiliza el nombre de clase comoespecificador de tipo:

myclass ob1, ob2; //objetos de tipo myclass

Page 39: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 39

Diferencia entre declaración de clases

y declaración de objetos

� Declaración de clase es una abstracción lógica que define un

nuevo tipo que determina cómo será un objeto de ese tipo.

� Declaración de un objeto crea una entidad física de ese tipo.

a

set_a(int num)get_a()

myclassMyclass

ocupa

Espacio de memoria

Page 40: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 40

Referencia a miembros públicos

� Una vez creado un objeto de una clase, el programa puede

referenciar sus miembros públicos utilizando el operador

punto:

ob1.set_a(10); //versión de ob1 de a con 10

ob2.set_a(99); //versión de ob2 de a con 99

� Cada objeto contiene su propia copia de cada variable

declarada dentro de la clase:

� La variable a vinculada ob1 es distinta de la variable a

vinculada a ob2

Page 41: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 41

Ejemplo #1: asignar un valor a a en los objetos ob1 y

ob2 y después mostrar dicho valor

#include <iostream.h>

class myclass {

//privado a myclass

int a;

public:

void set_a(int num);

int get_a();

}

void myclass::set_a(int num) {

a = num;

}

void myclass::get_a() {

return a;

}

Page 42: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 42

Ejemplo #1: asignar un valor a a en los objetos ob1 y

ob2 y después mostrar dicho valor

main ()

{

myclass ob1, ob2;

ob1.set_a(10);

ob2.set_a(99);

cout << ob1.get_a() << “\n”;

cout << ob2.get_a() << “\n”;

return 0;

}

Page 43: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 43

Ejemplo #2: la siguiente función main() producirá un

error de compilación

#include <iostream.h>

main ()

{

myclass ob1, ob2;

ob1.a = 10; //Error! no se puede acceder a un

ob2.a = 99; //miembro privado mediante

//funciones no miembro

cout << ob1.get_a() << “\n”;

cout << ob2.get_a() << “\n”;

return 0;

}

¿Por qué?

Page 44: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 44

Ejemplo #2: la siguiente función main() producirá un

error de compilación

#include <iostream.h>

main ()

{

myclass ob1, ob2;

ob1.a = 10; //Error! no se puede acceder a un

ob2.a = 99; //miembro privado mediante

//funciones no miembro

cout << ob1.get_a() << “\n”;

cout << ob2.get_a() << “\n”;

return 0;

}

Page 45: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 45

Ejemplo #3: declaración de a como miembro público

#include <iostream.h>

class myclass {

public:

//a es pública y no hace falta set_a() o get_a()int a;

};

main ()

{

myclass ob1, ob2;

ob1.a = 10; //se accede a “a” mediante “.”ob2.a = 99; cout << ob1.a << “\n”;

cout << ob2.a << “\n”;

return 0;

}

Page 46: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 46

Ejemplo #4: crea una clase stack que

implementa una pila que guarda caracteres

#include <iostream.h>

#define SIZE 10

//Declara una clase pila de caracteres

class stack {

char stck[SIZE]; //guarda la pila

int tos; //índice de la cabeza de la pila

public:

void init(); //inicializa la pila

void push(char ch); //mete carácter en la pila

char pop(); //saca carácter de la pila

};

//Inicializa la pila

void stack::init() {

tos = 0;

}

Page 47: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 47

Ejemplo #4: crea una clase stack que

implementa una pila que guarda caracteres

//Mete un carácter

void stack::push(char ch) {

if(tos == SIZE) {

cout << “La pila está llena”;

return;

}

stck[tos] = ch;

tos++;

}

//Saca un carácter

char stack::pop() {

if(tos == 0) {

cout << “La pila está vacía”;

return 0; //nulo cuando la pila está vacía

}

tos--;

return stck[tos];

}

Page 48: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 48

Ejemplo #4: crea una clase stack que implementa

una pila que guarda caracteres

main() {

stack s1, s2; //crea dos pilas

int i;

//inicializa las pilas

s1.init();

s2.init();

s1.push(‘a’); s2.push(‘x’);

s1.push(‘b’); s2.push(‘y’);

s1.push(‘c’); s2.push(‘z’);

for(i=0; i<3; i++)

cout << “saca de s1: “ << s1.pop() << “\n”;

for(i=0; i<3; i++)

cout << “saca de s2: “ << s2.pop() << “\n”;

return 0;

}

Page 49: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 49

Salida del ejemplo #4

Saca de s1: c

Saca de s1: b

Saca de s1: a

Saca de s2: z

Saca de s2: y

Saca de s2: x

Page 50: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 50

Observaciones sobre el programa

� Clase stack contiene dos variables privadas:

� stck: guarda los caracteres enviados a la pila

� tos: contiene el indice de la cabeza de la pila

� Clase stack tiene tres funciones publicas:

� init(): inicializa la pila

� push(): mete un carácter a la pila

� pop(): saca un carácter de la pila

� Dentro de main() se crean dos pilas independientes s1 y s2

� Cada objeto tiene su copia de stck y tos

� Todos los objetos de la clase stack comparten lasfunciones miembro

Page 51: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 51

Diferencias entre C y C++

� En C, se especifica una lista de parámetros

vacía mediante void, mientras que en C++ es

opcional.

� C: char funcion(void); En C++ es

redundante

� C++: char funcion(); En C, no se dice

nada sobre los parámetros

� En C++, todas las funciones deben estar en

forma de prototipo, mientras que en C es

opcional.

Page 52: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 52

Diferencias entre C y C++

� En C++, si una función se declara para

que devuelva un valor, entonces debe

hacerlo, mientras que en C no

necesariamente.

� En C, las variables locales se deben

declarar sólo al principio de un bloque,

mientras que en C++ se pueden declarar

en cualquier lugar.

Page 53: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 53

Ejemplo #1 de diferencias entre C y C++

� En un programa en C, es una práctica comúndeclarar main( ) como se muestra a continuacióncuando no toma argumentos de la línea de

órdenes:

main (void)

� Pero en C++, el uso de void es redundante:

main( )

Page 54: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 54

Ejemplo #2: este programa no compilará¿por qué?

#include <iostream.h>

main() {

int a, b, c;

cout << “Introduzca dos números: ”;

cin >> a >> b;

c = sum(a, b);

cout << “La suma es: ” << c;

return 0;

}

sum(int a, int b) {

return a+b;

}

Page 55: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 55

Ejemplo #2: este programa no compilaráporque sum() no está como prototipo

#include <iostream.h>

main() {

int a, b, c;

cout << “Introduzca dos números: ”;

cin >> a >> b;

c = sum(a, b);

cout << “La suma es: ” << c;

return 0;

}

//Esta función necesita un prototipo

sum(int a, int b) {

return a+b;

}

int sum(int a, int b);

Page 56: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 56

Ejemplo #3: declaración de variables locales en cualquier lugar

#include <iostream.h>

main() {

int i; //variables locales declaradas al//principio

cout << “Introduzca un número: ”;

cin >> i;

//Calcula el factorial

int j, fact=1; //variables declaradas después//de las sentencias de acción

for(j=i; j>=1; j--) fact = fact * j;

cout << “El factorial es: ” << fact;

return 0;

}

Page 57: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 57

Ventajas de C++ en la declaración de variables locales

� La posibilidad de declarar variables

locales cerca del lugar donde se usan por

primera vez ayuda a:

� Clarificar el código

� Prevenir efectos laterales no deseados

Page 58: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 58

Introducción a la sobrecarga de

funciones

� Mecanismo que permite a C++ adquirir un tipo

de polimorfismo.

� Base que permite al entorno de programación

de C++ ampliarse de manera dinámica.

Función 1 Función 2

nombre

comparte comparte

Tipo

argumentos

a condición que

Número

difiera difiera

Page 59: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 59

Sobrecarga de funciones

Principal ventaja:

Ayudan a reducir la complejidad de un programa

porque permite que operaciones relacionadas se

referencien con el mismo nombre.

¿Cómo sobrecargar una función?

� Declarar y definir todas las versiones requeridas.

� El compilador seleccionará automáticamente la versión

correcta para llamar con base en el tipo o número de argumentos.

Page 60: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 60

Ejemplo #1: sobrecarga de la función abs( )para calcular el valor absoluto

#include <iostream.h>

/*Contra ejemplo: la biblioteca estándar de C

contiene las funciones abs(), labs() y fabs() que

devuelven el valor absoluto de un entero, de un

largo y de un real, resp. */

//Sobrecarga abs() de tres formasint abs(int n);long abs(long n);double abs(double n);

main () {

cout << “Valor abs de –10: ” << abs(-10) << “\n”;

cout << “Valor abs de –10L: “ << abs(-10L) << “\n”;

cout << “Valor abs de –10.01: ” << abs(-10.01) <<

“\n”;

return 0;

}

Page 61: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 61

Ejemplo #1: sobrecarga de la función abs( )para calcular el valor absoluto

//abs( ) para enterosint abs(int n) {

cout << “Con un entero abs()\n”;

return n < 0 ? –n : n;

}

//abs( ) para largoslong abs(long n) {

cout << “Con un largo abs()\n”;

return n < 0 ? –n : n;

}

//abs( ) para realesdouble abs(double n) {

cout << “Con un real abs()\n”;

return n < 0 ? –n : n;

}

Page 62: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 62

Ejemplo #2: sobrecarga de la función date( ) para

aceptar fecha como cadena/entero

#include <iostream.h>

//fecha como cadenavoid date(char *date);

//fecha en númerosvoid date(int month, int day, int year);

main() {

date(“8/23/95”);

date(8, 23, 95);

return 0;

}

//Fecha como cadena

void date(char *date) {

cout << “Fecha: ” << date << “\n”;

}

Page 63: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 63

Ejemplo #2: sobrecarga de la función date( ) para

aceptar fecha como cadena/entero

//Fecha como enteros

void date(int month, int day, int year)

{

cout << “Fecha: ” << month << “/”;

cout << day << “/” << year << “\n”;

}

Page 64: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 64

Ejemplo #3: las versiones de la función f1difieren en el número de argumentos

#include <iostream.h>

void f1(int a);void f1(int a, int b);

main() {

f1(10);

f1(10, 20);

return 0;

}

void f1(int a) {

cout << “En f1(int a)\n”;

}

void f1(int a, int b) {

cout << “En f1(int a, int b)\n”;

}

Page 65: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 65

Ejemplo #4: el tipo devuelto no basta parapermitir la sobrecarga de funciones

//Este fragmento es incorrecto y no se

compilará

int f1(int a);

double f1(int a);

.

.

.

f1(10); //¿A que función llama el

compilador?

Page 66: Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Abel Federico Pérez Hernández 66

Bibliografía

�Diapositivas PowerPoint de Sonia Mendoza Chapa

[email protected]

�Fundamentos de programación C/C++, Ernesto Peñaloza Romero, CuartaEdición, Ed. Alfaomega.