SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
Programación Orientada a Objetos (POO)




     Abel Federico Pérez Hernández
Introducción
                                                           Años 50s
                                  Lenguaje                Lenguaje
                                 Ensamblador             FORTRAN

                                                      Código espaguetti
                                                      en programas de
                                                      miles de líneas
 Programas pequeños
                                                      Años 60s y 70s

                      Programas estructurados: se basan en
                      estructuras de control (secuencia,
 Programación         condicional e iteración), uso mínimo de
  estructurada        GOTO y subrutinas independientes que
                      soportan recursividad y variables locales,
Programas mayores     e.g. Algol y Pascal
de 50,000 líneas      Abel Federico Pérez Hernández                2
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.



               o3
    o1                                               Calcular
                    o1                                media
          o2

         Programa    Abel Federico Pérez Hernández              3
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ían
previamente 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 entre
objetos.
                    Abel Federico Pérez Hernández     4
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.

                Abel Federico Pérez Hernández   5
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 objetoAbel Federico Pérezde ellas.
                       a partir Hernández                  6
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.

                   Abel Federico Pérez Hernández     7
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.

                    Abel Federico Pérez Hernández         8
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
 nombre_Alumno                     Alumno             Curso
 curp
 dirección                       nombre            nombre
 teléfono                        curp              calificación
 nombre_Curso                    dirección         …
 calificación                    teléfono
 …                               …


Aumenta la cohesión de los componentes de sistema
Suele ser confundido con el principio de ocultamiento
                   Abel Federico Pérez Hernández              9
Principio de ocultamiento

Definición: mecanismo que protege datos y métodos
contra cualquier interferencia o mal uso.
                                                       Interfaz
  propiedades
                         Empaquetamiento
                         mediante un LOO                Objeto
    métodos


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

 Públicos: otras partes del programa pueden accederlos… se
 utilizan para ofrecer una interfaz controlada a las partes
 privadas del objeto. Abel Federico Pérez Hernández              10
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). Hernández
                    Abel Federico Pérez                      11
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.

 C++

                       Tipo de dato
     Clase general                                    Acción
      de acciones                                    específica

                     Abel Federico Pérez Hernández                12
Ejemplo de la vida diaria

Volante de un automovil funciona igual si utilizamos:
  Dirección mecánica
  Dirección asistida
  Dirección hidráulica

                                                      …
                            Diferentes
                            mecanismos
                            de dirección




Misma interfaz        Abel Federico Pérez Hernández       13
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.


                          o                   Implementación de abs()
                    enter
                    entero largo
     abs()                                    Implementación de labs()
                    real
Interfaz genérica                             Implementación de fabs()
                              Abel Federico Pérez Hernández              14
 (multi-métodos)
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.
                   Abel Federico Pérez Hernández   15
Polimorfismo aplicado a operadores
            aritméticos
La mayoría de los lenguajes de programación proveen
una aplicacion limitada del polimorfismo de operadores
aritméticos:

  e.g. en lenguaje C, el signo + se utiliza para
  añ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.
                   Abel Federico Pérez Hernández    16
Ejemplo de una lista

                                             Substituir objetos con
  cliente           Lista                    interfaces idénticas en tiempo
 …                insert(i)                  de ejecución.
                  extract(i)                 Simplificar la definición del
                                             cliente.
                                             Desacoplar objetos entre si.


   Pila       Implementación                     Cola     Implementación
              LIFO                                        FIFO
 insert(i)                                   insert(i)
 extract(i)                                  extract(i)

• Mismos tipos de datos
• Aplicación sobre un conjunto de métodos
                      Abel Federico Pérez Hernández                     17
Herencia

  Definición: proceso mediante el cual un objeto puede
  adquirir las propiedades de otro.
  Permite que un objeto soporte el concepto de
  clasificación jerárquica:
                                                                 General
                                                                      +
                                                       Obra-hombre

 es parte de            Estructura

           Edificio

Casa
                                                                      -
                       Abel Federico Pérez Hernández                       18
Herencia

En cualquier caso, la clase hija hereda todas las
cualidades asociadas con la clase padre y le añade sus
propias características definitorias.
                                        Organismos
                                           vivos
  es parte de               Plantas

                Vegetales

 Apio

Sin el uso de clasificaciones jerárquicas cada objeto
tendría que definir todas las características que se
relacionan con él explícitamente.
                       Abel Federico Pérez Hernández    19
Lenguajes Orientados a Objetos

Action Script 3                             Lexico (en castellano)
Ada                                         Objetive-C
C++                                         Ocaml
C#                                          Oz
VB.NET                                      Perl
Visual FoxPro                               PHP (versión 5)
Clarion                                     PowerBuilder
Builder C++                                 Python
Delphi                                      Ruby
Harbour                                     Smalltalk
Eiffel                                      Magik (SmallWorld)
Java

                  Abel Federico Pérez Hernández                      20
E/S en C++

Es posible utilizar las funciones printf() y scanf(), pero C++ ofrece
un 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
                         Abel Federico Pérez Hernández              21
E/S en C++

Ejemplos de <<: permite mostrar cualquier tipo básico de
C++
 cout << “Muestra esta cadena en pantallan”;
 cout << 100.99;

Ejemplos de >>: permite introducir cualquier tipo básico
de C++ desde el teclado
                   cin >> variable;
 int num;
 cin >> num;

                     Abel Federico Pérez Hernández    22
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 */
}                      Abel Federico Pérez Hernández   23
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 sola
       expresión de E/S */

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

    return 0;
}
                     Abel Federico Pérez Hernández   24
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;
}
                  Abel Federico Pérez Hernández   25
Ejemplo #4: pide un entero, un real y una
cadena 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;
}
                Abel Federico Pérez Hernández   26
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 entrada
esperando una operación posterior

           ¿Cuál es la salida?
                     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 [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
                    Abel Federico Pérez Hernández   28
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;
}
                      Abel Federico Pérez Hernández   29
Comentarios en C++

C++ propone dos formas diferentes de hacer
comentarios:
  Forma #1: es posible crear comentarios en varias
  líneas
  /* comentario
  …
  */
  Forma #2: sólo es posible hacer comentarios de una
  línea
  // comentario [retorno de carro y avance de línea]

                   Abel Federico Pérez Hernández   30
Ejemplo #1: combinación de comentarios en
                  estilos C y C++

/* Este es un comentario al estilo de C. Este
   programa determina si un entero es par o impar
*/
#include <iostream.h>

main () {
  int num; //comentario de una línea en C++

    //leer el número
    cout << “Introduzca el número a probar: “;
    cin >> num;

    //ver si es par o impar
    if((num%2)==0) cout << “El número es parn”;
    else cout << “El número es imparn”;
    return 0;
}                    Abel Federico Pérez Hernández   31
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
*/                  Abel Federico Pérez Hernández 32
Clases

Definición: mecanismo para crear objetos

                           Declaración

class nombre-clase {
  funciones y variables privadas
public:                                                 Miembros
                                                        de la clase
  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
                        Abel Federico Pérez Hernández                 33
Clases

  Por omisión, todas las funciones y
  variables declaradas en una clase
  son privadas

class nombre-clase {
                                                          Accesibles por
  funciones y variables privadas                          otros miembros de
                                                          esta clase
public:
                                                          Accesibles por
  funciones y variables públicas
                                                          otros miembros de
} lista de objetos;                                       esta clase y por
                                                          cualquier otra
                                                          parte del
                                                          programa que
                                                          contenga la clase
                          Abel Federico Pérez Hernández                       34
Ejemplo de declaración de una clase
                en 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 por
  cualquier parte del programa

                         Abel Federico Pérez Hernández         35
Definición de funciones miembro


       Operador de resolución del ámbito
                 (asociación)
tipo nombre-clase::nombre-func(lista-parámetros)



{
    ...//cuerpo de la función
}



                      Abel Federico Pérez Hernández   36
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;
}              Abel Federico Pérez Hernández   37
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 como
  especificador de tipo:

myclass ob1, ob2; //objetos de tipo myclass
                          Abel Federico Pérez Hernández          38
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.




              Myclass                                       myclass

          a                                                       ocupa

          set_a(int num)
          get_a()                                       Espacio de memoria
                        Abel Federico Pérez Hernández                        39
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

                       Abel Federico Pérez Hernández          40
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;
     }

                     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

main ()
{
  myclass ob1, ob2;

    ob1.set_a(10);
    ob2.set_a(99);

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

    return 0;
}
                   Abel Federico Pérez Hernández    42
Ejemplo #2: la siguiente función main() producirá un
                    error de compilación


#include <iostream.h>

main ()
{
   myclass ob1, ob2;

                                 ¿Por qué?
     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;
}
                        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;
}
                      Abel Federico Pérez Hernández   44
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;
}
                    Abel Federico Pérez Hernández     45
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;
}

                        Abel Federico Pérez Hernández   46
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];
}                    Abel Federico Pérez Hernández   47
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;
}
                      Abel Federico Pérez Hernández   48
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



       Abel Federico Pérez Hernández   49
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 las
   funciones miembro Federico Pérez Hernández
                          Abel                         50
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.       Abel Federico Pérez Hernández   51
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.
               Abel Federico Pérez Hernández   52
Ejemplo #1 de diferencias entre C y C++


En un programa en C, es una práctica común
declarar main( ) como se muestra a continuación
cuando no toma argumentos de la línea de
órdenes:

                  main (void)

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

                      main( )
                 Abel Federico Pérez Hernández   53
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;
}               Abel Federico Pérez Hernández   54
Ejemplo #2: este programa no compilará
    porque sum() no está como prototipo

#include <iostream.h>
int sum(int a, int b);
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;
}                 Abel Federico Pérez Hernández   55
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;
}                    Abel Federico Pérez Hernández   56
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



               Abel Federico Pérez Hernández   57
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.

             com                                        e
Función 1       part                                part           Función 2
                    e                            com
                          nombre
                                    a condición que
                 ra                                      difie
            difie       argumentos                            ra
  Tipo                   Abel Federico Pérez Hernández              Número     58
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.
                     Abel Federico Pérez Hernández   59
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 formas
int 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;
                     Abel Federico Pérez Hernández    60
}
Ejemplo #1: sobrecarga de la función abs( )
      para calcular el valor absoluto
//abs( ) para enteros
int abs(int n) {
  cout << “Con un entero abs()n”;
  return n < 0 ? –n : n;
}

//abs( ) para largos
long abs(long n) {
  cout << “Con un largo abs()n”;
  return n < 0 ? –n : n;
}

//abs( ) para reales
double abs(double n) {
  cout << “Con un real abs()n”;
  return n < 0 ? –n : n;
}
                 Abel Federico Pérez Hernández   61
Ejemplo #2: sobrecarga de la función date( ) para
      aceptar fecha como cadena/entero

#include <iostream.h>

//fecha como cadena
void date(char *date);
//fecha en números
void 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”;
}                Abel Federico Pérez Hernández      62
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”;
}



                   Abel Federico Pérez Hernández      63
Ejemplo #3: las versiones de la función f1
       difieren 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”;
}                  Abel Federico Pérez Hernández   64
Ejemplo #4: el tipo devuelto no basta para
    permitir 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?
                Abel Federico Pérez Hernández   65
Bibliografía

  Diapositivas PowerPoint de Sonia
  Mendoza Chapa
smendoza@cs.cinvestav.mx


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



                   Abel Federico Pérez Hernández   66

Mais conteúdo relacionado

Mais procurados

Lenguajes de programacion orientada a objetos
Lenguajes de programacion orientada a objetosLenguajes de programacion orientada a objetos
Lenguajes de programacion orientada a objetos
RicardoAlbertoSalmor
 
Curso de iniciacion a la programacion con visual basic net
Curso de iniciacion a la programacion con visual basic netCurso de iniciacion a la programacion con visual basic net
Curso de iniciacion a la programacion con visual basic net
Sauro Ortiz
 
Niveles de lenguaje de programación
Niveles de lenguaje de programaciónNiveles de lenguaje de programación
Niveles de lenguaje de programación
Stephany17
 

Mais procurados (19)

Curso Java Inicial 8 Conceptos Avanzados Applets
Curso Java Inicial   8 Conceptos Avanzados   AppletsCurso Java Inicial   8 Conceptos Avanzados   Applets
Curso Java Inicial 8 Conceptos Avanzados Applets
 
Lenguajes de programacion orientada a objetos
Lenguajes de programacion orientada a objetosLenguajes de programacion orientada a objetos
Lenguajes de programacion orientada a objetos
 
Curso de iniciacion a la programacion con visual basic net
Curso de iniciacion a la programacion con visual basic netCurso de iniciacion a la programacion con visual basic net
Curso de iniciacion a la programacion con visual basic net
 
Clase3 - Identificadores y directivas en Delphi
Clase3 - Identificadores y directivas en DelphiClase3 - Identificadores y directivas en Delphi
Clase3 - Identificadores y directivas en Delphi
 
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISP
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISPSotfware de Programacion Lógica - CLIPS, PROLOG, LISP
Sotfware de Programacion Lógica - CLIPS, PROLOG, LISP
 
Programacion orientada a objetos
Programacion orientada a objetos Programacion orientada a objetos
Programacion orientada a objetos
 
Curso Java Inicial 8 Conceptos Avanzados I O
Curso Java Inicial   8 Conceptos Avanzados   I OCurso Java Inicial   8 Conceptos Avanzados   I O
Curso Java Inicial 8 Conceptos Avanzados I O
 
Pseudocodigos
PseudocodigosPseudocodigos
Pseudocodigos
 
Curso python
Curso pythonCurso python
Curso python
 
Segundo trabajo
Segundo trabajoSegundo trabajo
Segundo trabajo
 
Apoo v
Apoo vApoo v
Apoo v
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++
 
Programacion
Programacion Programacion
Programacion
 
Lenguaje c tarea 3
Lenguaje c tarea 3Lenguaje c tarea 3
Lenguaje c tarea 3
 
Programacion kmi
Programacion kmiProgramacion kmi
Programacion kmi
 
Analizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador SintácticoAnalizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador Sintáctico
 
Estandares de Codigo (Emanuel)
Estandares de Codigo (Emanuel)Estandares de Codigo (Emanuel)
Estandares de Codigo (Emanuel)
 
Niveles de lenguaje de programación
Niveles de lenguaje de programaciónNiveles de lenguaje de programación
Niveles de lenguaje de programación
 
Sintaxis en java
Sintaxis en javaSintaxis en java
Sintaxis en java
 

Destaque (9)

audio conferencia
audio conferenciaaudio conferencia
audio conferencia
 
Algoritmos2
Algoritmos2Algoritmos2
Algoritmos2
 
Funcionesenlenguaje c
Funcionesenlenguaje cFuncionesenlenguaje c
Funcionesenlenguaje c
 
Tema1ec
Tema1ecTema1ec
Tema1ec
 
Lenguajec++
Lenguajec++Lenguajec++
Lenguajec++
 
Algoritmos2
Algoritmos2Algoritmos2
Algoritmos2
 
Lenguajec++
Lenguajec++Lenguajec++
Lenguajec++
 
Tema7
Tema7Tema7
Tema7
 
19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione - 19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione -
 

Semelhante a Cap%c3%8 dtulo+1+programacion+orientada+a+objetos

Lenguajes de programación
Lenguajes de programaciónLenguajes de programación
Lenguajes de programación
rulo182
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
janinaplaza
 
PROGRAMACION ORIENTADA A OBJETOS
PROGRAMACION ORIENTADA A OBJETOSPROGRAMACION ORIENTADA A OBJETOS
PROGRAMACION ORIENTADA A OBJETOS
Abraham Morales
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
Marcelo Brocel
 
Programación orientada a objeto
Programación orientada a objetoProgramación orientada a objeto
Programación orientada a objeto
HRS1993
 
Diseño Orientado a Objetos
Diseño Orientado a ObjetosDiseño Orientado a Objetos
Diseño Orientado a Objetos
MegaMono
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
vnslgars
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
Jonathan Marcillo
 
Programacion estructurada en objetos
Programacion estructurada en objetosProgramacion estructurada en objetos
Programacion estructurada en objetos
Angel Ordoñez
 

Semelhante a Cap%c3%8 dtulo+1+programacion+orientada+a+objetos (20)

Lenguajes de programación
Lenguajes de programaciónLenguajes de programación
Lenguajes de programación
 
Ed java
Ed javaEd java
Ed java
 
Entorno
EntornoEntorno
Entorno
 
Paradigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a ObjetosParadigma de Programación Orientado a Objetos
Paradigma de Programación Orientado a Objetos
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
 
PROGRAMACION ORIENTADA A OBJETOS
PROGRAMACION ORIENTADA A OBJETOSPROGRAMACION ORIENTADA A OBJETOS
PROGRAMACION ORIENTADA A OBJETOS
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
 
POO Programación Orientada a Objeto(s)
POO Programación Orientada a Objeto(s)POO Programación Orientada a Objeto(s)
POO Programación Orientada a Objeto(s)
 
Programación orientada a objeto
Programación orientada a objetoProgramación orientada a objeto
Programación orientada a objeto
 
Diseño Orientado a Objetos
Diseño Orientado a ObjetosDiseño Orientado a Objetos
Diseño Orientado a Objetos
 
Programación Orientada a Objetos (POO) y UML
Programación Orientada a Objetos (POO) y UMLProgramación Orientada a Objetos (POO) y UML
Programación Orientada a Objetos (POO) y UML
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Programacion orientada a objetos
Programacion orientada a objetosProgramacion orientada a objetos
Programacion orientada a objetos
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
 
LABORATORIO DE PROGRAMACIÓN I
LABORATORIO DE PROGRAMACIÓN ILABORATORIO DE PROGRAMACIÓN I
LABORATORIO DE PROGRAMACIÓN I
 
Programación orientada a objetos
Programación orientada a objetosProgramación orientada a objetos
Programación orientada a objetos
 
Programación Orientada a Objetos
Programación Orientada a ObjetosProgramación Orientada a Objetos
Programación Orientada a Objetos
 
Introduccion al lenguaje java
Introduccion al lenguaje javaIntroduccion al lenguaje java
Introduccion al lenguaje java
 
Programacion estructurada en objetos
Programacion estructurada en objetosProgramacion estructurada en objetos
Programacion estructurada en objetos
 
metodologia-de-programación orientada a Objetos
metodologia-de-programación orientada a Objetosmetodologia-de-programación orientada a Objetos
metodologia-de-programación orientada a Objetos
 

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

  • 1. Programación Orientada a Objetos (POO) Abel Federico Pérez Hernández
  • 2. Introducción Años 50s Lenguaje Lenguaje Ensamblador FORTRAN Código espaguetti en programas de miles de líneas Programas pequeños Años 60s y 70s Programas estructurados: se basan en estructuras de control (secuencia, Programación condicional e iteración), uso mínimo de estructurada GOTO y subrutinas independientes que soportan recursividad y variables locales, Programas mayores e.g. Algol y Pascal de 50,000 líneas Abel Federico Pérez Hernández 2
  • 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. o3 o1 Calcular o1 media o2 Programa Abel Federico Pérez Hernández 3
  • 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ían previamente 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 entre objetos. Abel Federico Pérez Hernández 4
  • 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. Abel Federico Pérez Hernández 5
  • 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 objetoAbel Federico Pérezde ellas. a partir Hernández 6
  • 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. Abel Federico Pérez Hernández 7
  • 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. Abel Federico Pérez Hernández 8
  • 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 nombre_Alumno Alumno Curso curp dirección nombre nombre teléfono curp calificación nombre_Curso dirección … calificación teléfono … … Aumenta la cohesión de los componentes de sistema Suele ser confundido con el principio de ocultamiento Abel Federico Pérez Hernández 9
  • 10. Principio de ocultamiento Definición: mecanismo que protege datos y métodos contra cualquier interferencia o mal uso. Interfaz propiedades Empaquetamiento mediante un LOO Objeto métodos Privados: sólo los conoce y son accesibles por otra parte del objeto, i.e. una parte del programa que esta fuera del objeto no puede accederlos. Públicos: otras partes del programa pueden accederlos… se utilizan para ofrecer una interfaz controlada a las partes privadas del objeto. Abel Federico Pérez Hernández 10
  • 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). Hernández Abel Federico Pérez 11
  • 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. C++ Tipo de dato Clase general Acción de acciones específica Abel Federico Pérez Hernández 12
  • 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 … Diferentes mecanismos de dirección Misma interfaz Abel Federico Pérez Hernández 13
  • 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. o Implementación de abs() enter entero largo abs() Implementación de labs() real Interfaz genérica Implementación de fabs() Abel Federico Pérez Hernández 14 (multi-métodos)
  • 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. Abel Federico Pérez Hernández 15
  • 16. Polimorfismo aplicado a operadores aritméticos La mayoría de los lenguajes de programación proveen una aplicacion limitada del polimorfismo de operadores aritméticos: e.g. en lenguaje C, el signo + se utiliza para añ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. Abel Federico Pérez Hernández 16
  • 17. Ejemplo de una lista Substituir objetos con cliente Lista interfaces idénticas en tiempo … insert(i) de ejecución. extract(i) Simplificar la definición del cliente. Desacoplar objetos entre si. Pila Implementación Cola Implementación LIFO FIFO insert(i) insert(i) extract(i) extract(i) • Mismos tipos de datos • Aplicación sobre un conjunto de métodos Abel Federico Pérez Hernández 17
  • 18. Herencia Definición: proceso mediante el cual un objeto puede adquirir las propiedades de otro. Permite que un objeto soporte el concepto de clasificación jerárquica: General + Obra-hombre es parte de Estructura Edificio Casa - Abel Federico Pérez Hernández 18
  • 19. Herencia En cualquier caso, la clase hija hereda todas las cualidades asociadas con la clase padre y le añade sus propias características definitorias. Organismos vivos es parte de Plantas Vegetales Apio Sin el uso de clasificaciones jerárquicas cada objeto tendría que definir todas las características que se relacionan con él explícitamente. Abel Federico Pérez Hernández 19
  • 20. Lenguajes Orientados a Objetos Action Script 3 Lexico (en castellano) Ada Objetive-C C++ Ocaml C# Oz VB.NET Perl Visual FoxPro PHP (versión 5) Clarion PowerBuilder Builder C++ Python Delphi Ruby Harbour Smalltalk Eiffel Magik (SmallWorld) Java Abel Federico Pérez Hernández 20
  • 21. E/S en C++ Es posible utilizar las funciones printf() y scanf(), pero C++ ofrece un 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 Abel Federico Pérez Hernández 21
  • 22. E/S en C++ Ejemplos de <<: permite mostrar cualquier tipo básico de C++ cout << “Muestra esta cadena en pantallan”; cout << 100.99; Ejemplos de >>: permite introducir cualquier tipo básico de C++ desde el teclado cin >> variable; int num; cin >> num; Abel Federico Pérez Hernández 22
  • 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 */ } Abel Federico Pérez Hernández 23
  • 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 sola expresión de E/S */ cout << i << ‘ ‘ << j << ‘ ‘ << d; return 0; } Abel Federico Pérez Hernández 24
  • 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; } Abel Federico Pérez Hernández 25
  • 26. Ejemplo #4: pide un entero, un real y una cadena 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; } Abel Federico Pérez Hernández 26
  • 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 entrada esperando una operación posterior ¿Cuál es la salida? Abel Federico Pérez Hernández 27
  • 28. 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 [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 Abel Federico Pérez Hernández 28
  • 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; } Abel Federico Pérez Hernández 29
  • 30. Comentarios en C++ C++ propone dos formas diferentes de hacer comentarios: Forma #1: es posible crear comentarios en varias líneas /* comentario … */ Forma #2: sólo es posible hacer comentarios de una línea // comentario [retorno de carro y avance de línea] Abel Federico Pérez Hernández 30
  • 31. Ejemplo #1: combinación de comentarios en estilos C y C++ /* Este es un comentario al estilo de C. Este programa determina si un entero es par o impar */ #include <iostream.h> main () { int num; //comentario de una línea en C++ //leer el número cout << “Introduzca el número a probar: “; cin >> num; //ver si es par o impar if((num%2)==0) cout << “El número es parn”; else cout << “El número es imparn”; return 0; } Abel Federico Pérez Hernández 31
  • 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 */ Abel Federico Pérez Hernández 32
  • 33. Clases Definición: mecanismo para crear objetos Declaración class nombre-clase { funciones y variables privadas public: Miembros de la clase 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 Abel Federico Pérez Hernández 33
  • 34. Clases Por omisión, todas las funciones y variables declaradas en una clase son privadas class nombre-clase { Accesibles por funciones y variables privadas otros miembros de esta clase public: Accesibles por funciones y variables públicas otros miembros de } lista de objetos; esta clase y por cualquier otra parte del programa que contenga la clase Abel Federico Pérez Hernández 34
  • 35. Ejemplo de declaración de una clase en 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 por cualquier parte del programa Abel Federico Pérez Hernández 35
  • 36. Definición de funciones miembro Operador de resolución del ámbito (asociación) tipo nombre-clase::nombre-func(lista-parámetros) { ...//cuerpo de la función } Abel Federico Pérez Hernández 36
  • 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; } Abel Federico Pérez Hernández 37
  • 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 como especificador de tipo: myclass ob1, ob2; //objetos de tipo myclass Abel Federico Pérez Hernández 38
  • 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. Myclass myclass a ocupa set_a(int num) get_a() Espacio de memoria Abel Federico Pérez Hernández 39
  • 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 Abel Federico Pérez Hernández 40
  • 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; } Abel Federico Pérez Hernández 41
  • 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; } Abel Federico Pérez Hernández 42
  • 43. Ejemplo #2: la siguiente función main() producirá un error de compilación #include <iostream.h> main () { myclass ob1, ob2; ¿Por qué? 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; } Abel Federico Pérez Hernández 43
  • 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; } Abel Federico Pérez Hernández 44
  • 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; } Abel Federico Pérez Hernández 45
  • 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; } Abel Federico Pérez Hernández 46
  • 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]; } Abel Federico Pérez Hernández 47
  • 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; } Abel Federico Pérez Hernández 48
  • 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 Abel Federico Pérez Hernández 49
  • 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 las funciones miembro Federico Pérez Hernández Abel 50
  • 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. Abel Federico Pérez Hernández 51
  • 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. Abel Federico Pérez Hernández 52
  • 53. Ejemplo #1 de diferencias entre C y C++ En un programa en C, es una práctica común declarar main( ) como se muestra a continuación cuando no toma argumentos de la línea de órdenes: main (void) Pero en C++, el uso de void es redundante: main( ) Abel Federico Pérez Hernández 53
  • 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; } Abel Federico Pérez Hernández 54
  • 55. Ejemplo #2: este programa no compilará porque sum() no está como prototipo #include <iostream.h> int sum(int a, int b); 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; } Abel Federico Pérez Hernández 55
  • 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; } Abel Federico Pérez Hernández 56
  • 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 Abel Federico Pérez Hernández 57
  • 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. com e Función 1 part part Función 2 e com nombre a condición que ra difie difie argumentos ra Tipo Abel Federico Pérez Hernández Número 58
  • 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. Abel Federico Pérez Hernández 59
  • 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 formas int 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; Abel Federico Pérez Hernández 60 }
  • 61. Ejemplo #1: sobrecarga de la función abs( ) para calcular el valor absoluto //abs( ) para enteros int abs(int n) { cout << “Con un entero abs()n”; return n < 0 ? –n : n; } //abs( ) para largos long abs(long n) { cout << “Con un largo abs()n”; return n < 0 ? –n : n; } //abs( ) para reales double abs(double n) { cout << “Con un real abs()n”; return n < 0 ? –n : n; } Abel Federico Pérez Hernández 61
  • 62. Ejemplo #2: sobrecarga de la función date( ) para aceptar fecha como cadena/entero #include <iostream.h> //fecha como cadena void date(char *date); //fecha en números void 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”; } Abel Federico Pérez Hernández 62
  • 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”; } Abel Federico Pérez Hernández 63
  • 64. Ejemplo #3: las versiones de la función f1 difieren 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”; } Abel Federico Pérez Hernández 64
  • 65. Ejemplo #4: el tipo devuelto no basta para permitir 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? Abel Federico Pérez Hernández 65
  • 66. Bibliografía Diapositivas PowerPoint de Sonia Mendoza Chapa smendoza@cs.cinvestav.mx Fundamentos de programación C/C++, Ernesto Peñaloza Romero, Cuarta Edición, Ed. Alfaomega. Abel Federico Pérez Hernández 66