República Bolivariana de Venezuela
Aldea Universitaria Fray Pedro de Agreda
PNFSI
http://aldeafraypedrodeagreda.wordpress.com
Elaborado por Prof. Elías Cisneros
[email protected]
23/12/09
Introducción a la Programación Orientada a Objetos en C++
Creative Usted es libre de:
* Copiar, distribuir y comunicar públicamente la obra . * Hacer obras derivadas .
Bajo las condiciones siguientes:
Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra).
No comercial. No puede utilizar esta obra para fines comerciales.
Programación Orientada a Objetos
La Programación Orientada a Objetos (POO) no es un lenguaje de programación, es una paradigma de programación que surgió por la necesidad de disminuir la complejidad al momento de la construcción de programas para computadoras. Hoy en día este paradigma está soportado en mayor o menor medida en todos los lenguajes tradicionales (C se ha convertido en C++, Pascal en Delphi, ) , Java, Phyton, PHP, etc.
Paradigma
Un paradigma es un conjunto de reglas que "rigen" una determinada disciplina. Estas reglas se asumen normalmente como verdades incuestionables. Cuando un paradigma ya no puede satisfacer las necesidades de una ciencia (por ejemplo, ante nuevos descubrimientos que invalidan conocimientos previos), es sucedido por otro. Se dice que un cambio de paradigma es algo dramático para la ciencia, ya que éstas aparecen como estables y maduras, sin embargo en ciertas condiciones o situaciones aparecen enfoques diferentes que dan solución, explicación, sentido de forma válida a determinados temas . En el campo de la programación, no es muy diferente, un paradigma es un conjunto de conceptos que guía el proceso análisis, diseño y construcción de un programa.
Conceptos generales
La POO es la evolución natural de la programación estructurada, por lo tanto es importante para las personas que tiene algún conocimiento de programación dejar a un lado algunas ideas preconcebidas acerca de cómo debe diseñarse un programa, la POO tiene una forma diferente abordar los problemas y sus soluciones.
Evolución de los lenguajes de programación
Una de los objetivos de los lenguajes de programación es hacer de la construcción de programas para computadores sea lo más simple (reducir la complejidad), flexible y portable posible. Desde el punto de vista de algunos autores la evolución en los lenguajes, ha venido impulsada por dos motores bien distintos:
• Los avances tecnológicos
• Los avances conceptuales (de planteamiento) • Los avances en cuanto a enfoque de la programación
Evolución en cuanto a los avances tecnológicos
Cronológicamente el primer avance importante de los lenguajes de programación vino con la aparición de los lenguajes ensambladores, antes de esta etapa se utilizaban código binario para indicar al computador las instrucciones que debían realizar, a medida que se incremento el tamaño y la complejidad de los programas apareció el Ensamblador, este lenguaje se le llamó también lenguaje de "bajo nivel", ya que se hallan estrechamente ligados a la forma de trabajo de la máquina para la cual se está haciendo el programa. Hoy en día este tipo de programación se utiliza en ámbitos muy específicos y por lo tanto no es lo habitual para la mayoría de desarrollos de aplicaciones. El problema de los lenguajes ensambladores es que se hallan fuertemente relacionados con la máquina o hardware, un programa escrito en lenguaje ensamblador solo podrá ser ejecutado en la máquina donde fue diseñado.
de la complejidad, es mucho más rápido de escribir, por tanto, resulta más fácil detectar y corregir errores. Esto se debe principalmente a dos factores: por un lado, cada instrucción escrita en lenguaje de alto nivel puede equivaler a varias decenas e incluso cientos de instrucciones en ensamblador; por otra parte, la sintaxis de las instrucciones y las palabras reservadas utilizadas se parecen al lenguaje natural ( en el caso del inglés).
Otro aspecto importante es el tema del rendimiento, los programas escritos con lenguajes de alto nivel realizan los mismos procesos que los realizados con lenguajes de bajo nivel pero de un modo más lento, sin embargo este tema no es demasiado problema observando la evolución en la potencia de cálculo de las máquinas en los últimos años.
Evolución en cuanto a Conceptualización
El primer paso en paradigma de programación vino con la Programación Estructurada también
llamado programación procedural. Un paradigma estructurado tiene como objetivo lograr una definición completa del sistema en términos de funciones, este paradigma sugiere que el análisis y diseño que se hagan, sean un conjunto de procedimientos descendentes, esto quiere decir que se realiza una descomposición funcional de procesos en otros procesos de menor nivel. La programación estructurada es una forma de escribir programas en función tres estructuras: secuencia, selección e iteración, también se utilizan funciones o procedimientos que incorporan modularidad y reutilización en el código fuente.
Por ejemplo, la programación en lenguaje ensamblador es lineal, es decir, las instrucciones se ejecutan en el mismo orden en que son escritas. Sin embargo en lenguaje que es otro lenguaje basado en paradigma de programación estructurado se puede alterar el orden de ejecución haciendo saltos desde una instrucción a otro lugar del programa mediante el uso de funciones o procedimientos. La principal desventaja del paradigma de programación estructurado es que se obtiene un único bloque de programa, que cuando se hace demasiado grande puede resultar problemático su manejo; esto se resuelve empleando la programación modular, definiendo módulos interdependientes programados y compilados por separado (en realidad esto no es necesario, pero es recomendable para su mantenimiento y funcionalidad).
Programación Orientada a Objetos (POO)
Es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas. Está basado en varias principios, incluyendo herencia, modularidad, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de 1990, como evolución de la programación estructurada, actualmente son muchos los lenguajes de programación que soportan la orientación a objetos. Lo que no significa que al utilizar un lenguaje que soporte POO estamos haciendo uso de la misma, es necesario enfocar el diseño del programa al enfoque orientado a objetos. La POO permite realizar programas mediante la unión de elementos más simples que pueden ser diseñados y comprobados de manera independiente del programa que va a usarlos, muchos de estos elementos podrán ser reutilizados en otros programas. La POO ofrece mayor dominio sobre el programa, esto es posible principalmente porque los objetos impiden mezclar sus datos con otros métodos distintos a los suyos.
cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento.
Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida.
Características de la POO
Abstracción: Es un proceso mental que tiene en cuenta dos aspectos: identificar lo relevante del objeto de estudio y desechar aquello considerado irrelevante. En el proceso de abstracción se identifican las características esenciales de un objeto su comportamiento. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos.
Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad. Esto permite aumentar la cohesión de los componentes del sistema. Adicionalmente el concepto de Encapsulamiento tiene relación con el concepto de ocultación de los datos, mas no significan lo mismo.
Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas.
Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica.
Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común.
Conceptos básicos de la POO
Clase
Las clases constituyen la base de la programación orientada a objetos, es la unidad fundamental de encapsulamiento, más adelante se verá que la clase se utiliza para crear objetos. A continuación algunos conceptos para ayudar a aclarar la idea:
Una clase es una representación real o abstracta del mundo real, es el conjunto de definiciones de atributos y comportamiento de un tipo de objeto concreto. Una clase contiene una completa y detallada descripción de la información y los métodos que contendrá cada objeto de esa clase. Las clases se pueden ver como una generalización de una categoría, son tipos de datos definidos por el programador y pueden ser utilizados de igual manera que los tipos de datos propios del C++, tales como int o float, sin embargo es una estructura de datos con comportamiento el cual lo obtienen a través de sus métodos.
Cada clase contiene :
• Atributos (datos miembro o campos), los cuales especifican las propiedades de los objetos, expresan el estado del objeto.
• Métodos (funciones miembro o métodos), mediante los cuales se modela su comportamiento y las acciones que puede realizar. Se utilizan en el intercambio de mensajes o comunicación con otros objetos.
Definición en C++
Las clases se crean utilizando la palabra reservada class. La sintaxis de la declaración de una clases es la siguiente:
class nombre_clase{
// métodos y variables privadas public:
// métodos y variables publicas };
Las variables y métodos que se declaran dentro de la declaración de una clase se llaman miembros de la clase. Por defecto, todas las variables y métodos de las clases en C++ son privadas con respecto a dicha clase, es decir que solo pueden ser accedidas por otros miembros de esa misma clase. Para declarar miembros públicos se utiliza la palabra reservada public seguida de dos puntos (:), entonces todos los atributos y métodos que son declarados después del especificador public serán accedidos por cualquier clase del programa. A continuación la declaración de una clase sencilla:
class Persona{
// Atributos privados respecto a la clase Persona int edad;
public:
void setEdad(int num){ edad = num;
}
return edad; }
};
Esta clase tiene un atributo privado llamado edad y dos funciones públicas, setEdad() y getEdad. Entonces como edad es un atributo privado no es accesible a ningún código que esté fuera de la clase Persona, sin embargo como setEdad() y getEdad() son métodos miembros estos si pueden acceder al atributo edad.
Objetos
Es cualquier cosa real o abstracta capaz de almacenar datos y que posee métodos para su manipulación. Es una entidad provista de un conjunto de atributos (datos) y de comportamiento (métodos) los mismos que consecuentemente reaccionan a eventos, estos atributos y métodos previamente han sido definidos en una clase. Los objetos son instancia, ocurrencias, hechos particulares de una clase. Por lo tanto la declaración de una clase es una abstracción lógica que define un nuevo tipo de datos. La declaración de un objeto crea un ente físico de ese tipo, desde el punto de vista técnico, al crearse un objeto este ocupa espacio en la memoria, pero la definición, es decir una clase no ocupa espacio en memoria. La declaración de un objeto se realiza de la siguiente manera:
Persona per1, per2;
Una vez que ha sido creado un objeto de una clase, se puede referenciar sus miembros públicos utilizando el operador punto, por ejemplo:
per1.setEdad(27); // Establece en 27 el atributo edad del objeto per1 per2.setEdad(14); // Establece en 14 el atributo edad del objeto per2
Cada objeto de una clase tiene su propia copia de todos los atributos que están declarados dentro de la clase.
Propiedad o atributo
Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. Algunos ejemplos
class Casa{
int cant_ventanas; int metros_cuadrados; public:
float precio; int cant_cuartos;
void setPrecio( float valor) {
} ... }
int main(){ Casa miCasa;
miCasa.cant_ventanas=5; miCasa.setPrecio(45000); return 0;
}
Método
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. Los métodos especifican la forma en que se controlan los datos de un objeto. Los métodos en un tipo de objeto sólo hacen referencia a la estructura de datos de ese tipo de objeto. No deben tener acceso directo a las estructuras de datos de otros objetos. Para utilizar la estructura de datos de otro objeto, deben enviar un mensaje a éste. El tipo de objeto empaca juntos los tipos de datos y su comportamiento.
tipo_retorno nombre_metodo (lista de parametros) {
//Implementación }
Suponiendo el ejemplo de la clase Casa, el método setPrecio se debe referenciar de la siguiente manera, miCasa.setPrecio(45000); , entonces se debe seguir lo siguiente: nombre_objeto.metodo().
Visibilidad de los atributos y métodos ( Modificadores de Acceso)
Una método miembro puede acceder de forma directa a los atributos miembros o a otras métodos miembros sin necesidad de cualificarlas con el nombre del objeto. Haciendo referencia a la clase Casa definida anteriormente, el método setPrecio hace referencia directamente al atributo precio, es decir que dentro de la implementación del método setPrecio se manipula el atributo sin hacer referencia al nombre del objeto, la razón por la cual es accedido directamente es porque el objeto sobre el que opera el método setPrecio ya es conocido. Siguiendo la idea, fuera de Casa, el método setPrecio solamente puede ser accedido conjuntamente con un objeto. Por ejemplo en la función main() la línea sería miCasa.setPrecio está estableciendo el valor del atributo precio del objeto miCasa. Existen sentencias para indicar que atributos y métodos miembros son accesibles desde fuera de la cápsula del objeto.
Modificador de acceso public:
para cualquier objeto externo.
Modificador de acceso private:
Define los atributos y métodos que están restringidos, es decir con acceso privado para objetos externos, solo los métodos de la clase tienen acceso a estos atributos y métodos que hayan sido definidos luego de la instrucción private: .Al intentar acceder a un atributo o método privado desde fuera del objeto obtendremos un error en tiempo de compilación indicando que el atributo o método no es accesible.
Para ejemplificar estos términos revise la siguiente clase, la cual es una abstracción de una persona. Transcriba este programa, guardelo con el nombre persona.cpp, para compilar utilice g++ persona.cpp -o persona. Para ejecutar ./persona
1. #include<iostream> 2. #include<string.h> 3. using namespace std; 4. class Persona{
5. // Atributos privados respecto a la clase Persona 6. int edad;
7. string nombre;
8. // Métodos públicos respecto a la clase Persona
9. public:
10. void setEdad(int num){ 11. edad = num;
12. }
13. int getEdad(){ 14. return edad;
15. }
16. void setNombre(string val){ 17. nombre = val;
18. }
19. string getNombre(){
20. return nombre;
21. }
22. void imprimirDatos(){
23. cout<<"Nombre: "<<nombre<<endl; 24. cout<<"Edad: "<<edad<<endl;
25. }
26. 27. };
28. /* Programa Principal*/ 29. int main(){
30. Persona per1,per2; // Declaración de dos objetos de la Clase Persona
33. per1.imprimirDatos(); 34.
35. per2.setNombre("Ligia V"); // Establece en Ligia V el atributo nombre del objeto per2 36. per2.setEdad(14); // Establece en 14 el atributo edad del objeto per2
37. per2.imprimirDatos(); 38.
39. return 0; 40. }
Mensajes a objetos
Esta expresión está ligada directamente a los métodos, y no es más que otra forma de referirise a la interacción entre objetos mediante la utilización de sus métodos. Para que un objeto haga algo, se le envía una solicitud, esta hace que se produzca una operación. La operación ejecuta el método apropiado y, de manera opcional, produce una respuesta. El mensaje que constituye la solicitud contiene el nombre del objeto, el nombre de una operación y, a veces, un grupo de parámetros. Por lo tanto es una una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. La estructura de un mensaje es:
• El objeto al cual se le envía el mensaje. • El método que se desea ejecutar.
• Cualquier otra información que necesite el método para poder actuar (parámetros).
La forma de enviar un mensaje a un objeto es la siguiente: Objeto.metodo(parámetros);
Ejemplos:
Suponga una clase llamada Automóvil, los atributos y métodos serían los siguientes:
Atributos Marca Color Modelo Peso Caja
Cilindros del motor
Métodos Encender Apagar Avanzar Detener Girar Izquierda Girar Derecha
Ejercicios
Definir atributos y métodos para las siguientes categorías o clases:
Libro
Asignatura
Atributos: Nombre, cantidad de créditos, contenidos, cantidad de horas semanales, trimestre. Métodos: definirNombre , obtenerNombre, definirContenidos, obtenerContenidos.
Animal
Atributos: Especie, reino, nombre común, nombre científico, método de reproducción.
Métodos: Nacer, morir, reproducirse, definirNombreComun, obtenerNombreComun, obtenerReino.
Ciudad
Atributos: Nombre, cantidad de habitantes, area en metros cuadrados, estado, ciudades vecinas. Métodos: definirNombre, obtenerNombre, obtenerEstado, obtenerCiudadesVecinas.
Persona
Atributos: Nombre, Apellido, peso, tamaño, nacionalidad, sexo, edad. Métodos: definirNombre, obtenerNombre, caminar, dormir, comer.
Celular
Atributos: Nombre, marca, tecnología, capacidad de memoria interna, tamaño agenda.
Método: definirNombre, obtenerNombre, llamar, colgar llamada, tener llamada en espera, definir buzón de voz.
Bombillo
Atributos: Capacidad , luminosidad, tiempo de vida, tamaño. Métodos: definirCapacidad, obtenerCapacidad, encender, apagar.
Ejercicios propuestos
Bibliografía.
Herbert Schildt, C++ para programadores. Serie McGraw Hill de Informática. Madrid, 1996.
Introducción a la OOP. Grupo Eidos
Aprenda C++ como si estuviera en primero. Javier García de Jalón, José Ignacio Rodríguez, José María Sarriegui, Alfonso Brazález
Clases en C++ . Universidad de Carabobo .Facultad Experimental de Ciencias y Tecnología . Algoritmos y Programación II . Enero de 2005 .
Concepto de Paradigma. Obtenido de http://netgocios.bligoo.com/content/view/37882
Concepto de Paradigma. http://definicion.de/paradigma/
Programación Estructurada, http://es.wikipedia.org/wiki/Programaci%C3%B3n_estructurada
Programación Orientada a Objetos. http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos