Informtica Industrial Ing. en automtica y electrnica Industrial Isidro Calvo Informtica Industrial 2006/07 2 Objetivos principales Exponer las ideas bsicas de la programacin orientada a objetos (POO) Comparar el enfoque tradicional (prog. estructurada) con el enfoque OO Ver cules son las principales diferencias entre C y C++ Isidro Calvo Informtica Industrial 2006/07 3 Qu es la POO? Es un modelo de programacin ms abstracto Pretende organizar los programas a imagen y semejanza de la organizacin de los objetos del mundo real Contiene informacin de los objetos + las acciones que se pueden realizar con ellos Objetos = Mtodos (Operaciones) + Atributos (Datos) Pueden crearse varios objetos del mismo tipo a partir de modelos (Clases) Isidro Calvo Informtica Industrial 2006/07 4 Ejemplo: Una cuenta bancaria Clase: Cuenta Atributos (Informacin de la cuenta): Nombre Nmero de cuenta Saldo Mtodos (Operaciones que se pueden hacer con ella): Ingresar Dinero Retirar Dinero Abonar Intereses Obtener Saldo Actual Ordenar Transferencia Isidro Calvo Informtica Industrial 2006/07 5 Lenguajes de programacin OO Proporcionan mecanismos para estructurar el cdigo de acuerdo a las caractersticas de la POO: Algunos lenguajes OO: C++ Java Delphi (Object Pascal) Visual Basic Ada etc Isidro Calvo Informtica Industrial 2006/07 6 Conceptos principales (I) Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad ("mtodos"). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas. Isidro Calvo Informtica Industrial 2006/07 7 Conceptos principales (II) Mtodo: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema. Mensaje: una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus mtodos con ciertos parmetros asociados al evento que lo gener. Isidro Calvo Informtica Industrial 2006/07 8 Conceptos principales (III) 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 cuyo valor puede ser alterado por la ejecucin de algn mtodo. Evento: un suceso en el sistema (tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Estado interno: es una propiedad invisible de los objetos, que puede ser nicamente accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). Isidro Calvo Informtica Industrial 2006/07 9 Diseo de programas OOs Concepto tradicional de programa (No OO): Lista de instrucciones a ser ejecutadas por una mquina Filosofa de diseo OO: Conjunto de objetos que dialogan entre s para realizar una serie de tareas Isidro Calvo Informtica Industrial 2006/07 10 Programas OO Un programa OO es un programa que usa objetos. Por ejemplo: Una aplicacin bancaria relacionar objetos que representan entidades bancarias tales como cuentas, valores, etc. Una aplicacin de fabricacin puede utilizar objetos que representan diversos dispositivos fsicos tales como robots, PLCs, CNCs, etc. Isidro Calvo Informtica Industrial 2006/07 11 Una clase en C++ La clase es la base de C++ Es preciso definir la forma general de la clase con la palabra reservada class Una clase puede contener partes privadas private y pblicas public Los mtodos y atributos declarados como private slo se pueden usar por mtodos de la clase Los mtodos y atributos declarados como public se ven desde dentro y fuera de la clase Frecuentemente se separa el interfaz de la clase en un fichero con extensin .h y el cdigo en un fichero con extensin .cpp Isidro Calvo Informtica Industrial 2006/07 12 Ej: Una cuenta bancaria class cCuenta { private: //Atributos double tipoDeInteres; double saldo; string cuenta; string nombre; public: //Mtodos cCuenta(); //Constructor virtual ~cCuenta(); //Destructor void asignarNombre(string nom); void asignarCuenta(string cue); string obtenerNombre(); string obtenerCuenta(); double obtenerTipoDeInteres(); double estado(); void asignarTipoDeInteres(double tipo); void reintegro(double cantidad); void ingreso(double cantidad); }; Isidro Calvo Informtica Industrial 2006/07 13 Programa principal int main() { cCuenta cuenta01; //Creacin de un objeto cCuenta cuenta01.asignarNombre(Pepito); cuenta01.asignarCuenta(123456790); cuenta01.asignarTipoDeInteres(2.5); cuenta01.ingreso(12000); cuenta01.reintegro(3000); cout << cuenta01.obtenerNombre() << endl; cout << cuenta01.obtenerCuenta() << endl; cout << cuenta01.estado() << endl; cout << cuenta01.obtenerTipoDeInteres() << endl; } Isidro Calvo Informtica Industrial 2006/07 14 Ficheros involucrados Clase Cuenta bancaria: cCuenta.h Contiene la estructura de la clase cCuenta cCuenta.cpp Contiene el cdigo asociado a cada mtodo de la clase Programa orientado a objetos (P.e. Banco.cpp): Instancia (crea) objetos a partir de una clase (cCuenta) Utiliza los objetos (enva mensajes mtodos para que los objetos realicen tareas) Isidro Calvo Informtica Industrial 2006/07 15 // FICHERO: cCuenta.h // Contiene la estructura de la clase cCuenta #include <iostream.h> #include <string.h> using namespace std; class cCuenta { private: //Atributos double tipoDeInteres; double saldo; string cuenta; string nombre; public: //Mtodos cCuenta(); //Constructor virtual ~cCuenta(); //Destructor void asignarNombre(string nom); string obtenerNombre(); void asignarCuenta(string cue); string obtenerCuenta(); void asignarTipoDeInteres(double tipo); double obtenerTipoDeInteres(); void reintegro(double cantidad); void ingreso(double cantidad); double estado(); }; Isidro Calvo Informtica Industrial 2006/07 16 // FICHERO: cCuenta.cpp // Cdigo asociado a cada uno de los mtodos #include "cCuenta.h" void cCuenta::asignarNombre(string nom) { if(nom.length()==0) { cout << "Error: cadena vacia" << endl; return; } nombre= nom; } string cCuenta::obtenerNombre() { return nombre; } ... // Contina Isidro Calvo Informtica Industrial 2006/07 17 ... // Viene de la transparencia anterior void cCuenta::ingreso(double cantidad) { if (cantidad <0) { cout << "Error: cantidad negativa" << endl; return; } saldo = saldo + cantidad; } void cCuenta::reintegro(double cantidad) { if (saldo - cantidad < 0) { cout << "Error: no dispone de saldo" << endl; return; } saldo = saldo -cantidad; } double cCuenta::estado() { return saldo; } ... // etc. Isidro Calvo Informtica Industrial 2006/07 18 // Programa principal Banco.cpp #include <iostream.h> //Permite usar cout, cin, <<, >>, etc #include cCuenta.h //Contiene la clase cCuenta int main() { cCuenta cuenta01; //Creacin de un objeto a parir de //la clase cCuenta cuenta01.asignarNombre(Pepito); cuenta01.asignarCuenta(123456790); cuenta01.asignarTipoDeInteres(2.5); cuenta01.ingreso(12000); cuenta01.reintegro(3000); cout << Nombre: << cuenta01.obtenerNombre() << endl; cout << N.Cuenta: << cuenta01.obtenerCuenta() << endl; cout << Saldo: << cuenta01.estado() << endl; cout << Tipo Interes <<cuenta01.obtenerTipoDeInteres()<< endl; return 0; } Isidro Calvo Informtica Industrial 2006/07 19 Isidro Calvo Informtica Industrial 2006/07 20 Constructor Un constructor es un mtodo especial que es llamado automticamente al crear un objeto de esa clase Contiene el cdigo que se ejecuta al iniciar el objeto Tiene el mismo nombre que la clase No puede retornar ningn valor (ni siquiera void) Si no se escribe uno se adopta uno por defecto Puede haber ms de un constructor, con diferentes parmetros Isidro Calvo Informtica Industrial 2006/07 21 Constructores (cCuenta.h) class cCuenta { private: //Atributos double tipoDeInteres; double saldo; string cuenta; string nombre; public: //Mtodos //CONSTRUCTORES cCuenta(); cCuenta (string nom, string cue, double sal, double tipo); //DESTRUCTOR virtual ~cCuenta(); // Resto de mtodos ... }; Isidro Calvo Informtica Industrial 2006/07 22 Constructores (cCuenta.cpp) cCuenta::cCuenta() { saldo=0; tipoDeInteres=0.0; } cCuenta::cCuenta (string nom, string cue, double sal, double tipo) { asignarNombre(nom); asignarCuenta(cue); saldo=sal; tipoDeInteres=tipo; } Isidro Calvo Informtica Industrial 2006/07 23 // Programa principal Banco.cpp #include cCuenta.h //Contiene la clase cCuenta int main() { //Constructor POR DEFECTO: cCuenta::cCuenta() cCuenta cuenta01; //Constructor cCuenta::cCuenta(parametros) cCuenta cuenta02(Juanito, 0987654321, 6000, 3.5); cuenta01.asignarNombre(Pepito); cuenta01.ingreso(12000); //... cout << Nombre: << cuenta01.obtenerNombre() << endl; cout << Saldo: << cuenta01.estado() << endl; cout << Nombre: << cuenta02.obtenerNombre() << endl; cout << Saldo: << cuenta02.estado() << endl; return 0; } Isidro Calvo Informtica Industrial 2006/07 24 Destructor En muchas ocasiones un objeto debe realizar alguna(s) accion(es) cuando se destruye P.e. Liberar memoria Es llamado automticamente cuando el objeto se destruye Tiene el mismo nombre que el constructor (la clase), pero precedido con el smbolo ~ Isidro Calvo Informtica Industrial 2006/07 25 Caractersticas de la POO Encapsulamiento Concepto de una caja negra. Parte del cdigo o datos pueden ser privados al objeto e inaccesibles fuera de l Herencia Un objeto puede adquirir las propiedades de otro objeto y expandirlas Permite clasificaciones jerrquicas Polimorfismo Se permite usar el mismo nombre de un mtodo para varios propsitos relacionados pero ligeramente diferentes Isidro Calvo Informtica Industrial 2006/07 26 class cCuenta { private: // protected double saldo; string cuenta; string nombre; // METODO PRIVADO: Slo puede ser llamado dentro // la clase cCuenta y no desde el programa principal void hacerAlgo(void); public: cCuenta(); virtual ~cCuenta(); void asignarNombre(string nom); string obtenerNombre(); void reintegro(double cantidad); void ingreso(double cantidad); double estado(); }; Encapsulamiento Isidro Calvo Informtica Industrial 2006/07 27 Herencia: Jerarqua de clases Clase cCuenta Clase cCuenta Clase cCuentaAhorro Clase cCuentaAhorro Clase cCuentaCorriente Clase cCuentaCorriente Isidro Calvo Informtica Industrial 2006/07 28 //FICHERO: cCuentaAhorro.h class cCuentaAhorro : public cCuenta { private: // Propiedad ADICIONAL double cuotaMantenimiento; public: // Mtodos ADICIONALES cCuentaAhorro(string nom, string cue, double sal, double tipo, double mant); void asignarCuotaManten(double cantidad); double obtenerCuotaManten(); // reintegro tapa al mtodo reintegro de cCuenta void reintegro(double cantidad); }; Herencia: cCuentaAhorro.h La clase cCuentaAhorro hereda la estructura de cCuenta Isidro Calvo Informtica Industrial 2006/07 29 // FICHERO: cCuentaAhorro.cpp #include "cCuentaAhorro.h" // CONSTRUCTOR cCuentaAhorro::cCuentaAhorro(string nom, string cue, double sal, double tipo, double mant) { asignarNombre(nom); asignarCuenta(cue); saldo=sal; tipoDeInteres=tipo; asignarCuotaManten(mant); } // CDIGO DE LOS MTODOS void cCuentaAhorro::asignarCuotaManten(double cantidad) { if(cantidad < 0) { cout << "Error: cantidad negativa" << endl; return; } cuotaMantenimiento = cantidad; } ... // etc. Isidro Calvo Informtica Industrial 2006/07 30 Atributos nombre cuenta saldo tipoDeInteres Clase cCuenta Mtodos Constructores cCuenta asignarNombre obtenerNombre asignarCuenta obtenerCuenta estado ingreso reintegro asignarTipoDeInteres obtenerTipoDeInteres Isidro Calvo Informtica Industrial 2006/07 31 Atributos nombre cuenta saldo tipoDeInteres cuotaMantenimiento Clase cCuentaAhorro Mtodos Constructores cCuenta asignarNombre obtenerNombre asignarCuenta obtenerCuenta estado ingreso reintegro asignarTipoDeInteres obtenerTipoDeInteres Constructores cCuentaAhorro asignarCuotaManten obtenerCuotaManten reintegro Isidro Calvo Informtica Industrial 2006/07 32 Polimorfismo El polimorfismo en C++ se consigue con la sobrecarga de funciones La sobrecarga permite que dos o ms funciones puedan compartir el mismo nombre (aunque con distintos parmetros) Es el compilador quien decide (en base a los tipos de los parmetros) cul debe utilizar Isidro Calvo Informtica Industrial 2006/07 33 //FICHERO: cOperaciones.h class cOperaciones { public: //... int calcularCuadrado(int i); double calcularCuadrado(double d); trgComplejo *calcularCuadrado(trgComplejo *prg); }; //FICHERO: cOperaciones.cpp cOperaciones::calcularCuadrado(int i){ return (i*i); }; cOperaciones::calcularCuadrado(double d){ return (d*d); }; // ... sigue Ejemplo Isidro Calvo Informtica Industrial 2006/07 34 //FICHERO: cOperaciones.cpp //Contina de la trasparencia anterior trgComplejo * cOperaciones::cuadrado(trgComplejo *prg) { trgComplejo rgAux; rgAux.real = cuadrado(prg->real) cuadrado(prg->imag); rgAux.imag = 2*prg->real*prg->imag; (*prg) = rgAux; return (prg); } Ejemplo Isidro Calvo Informtica Industrial 2006/07 35 Ejemplo #include <iostream.h> int main(void) { int i; double num; trgComplejo rgNum, * prg; cOperaciones Objeto; cout << "Dame un numero entero: "; cin >> i; cout << i << ": " << Objeto.cuadrado(i) << endl; //... Objeto.cuadrado(num); //... prg = Objeto.cuadrado(&rgNum); //... } Isidro Calvo Informtica Industrial 2006/07 36 Entrada y Salida estndar Normalmente los programas en C++ usan cin y cout en lugar de printf y scanf Las operaciones de entrada/salida estndar se encuentran en la biblioteca <iostream.h> cout : Muestra por pantalla un mensaje. (Si es preciso se formatean las variables) Ej: cout << Dato I: << I << endl; cin : Lee de teclado y carga el valor ledo en una variable (tipos bsicos o cadenas) Ej: cin >> i ; Isidro Calvo Informtica Industrial 2006/07 37 asm catch class delete friend inline new operator overload Palabras reservadas de C++ private protected public template this throw try virtual Isidro Calvo Informtica Industrial 2006/07 38 Conclusiones C++ es un superconjunto de C Aade una serie de palabras reservadas C++ permite programar siguiendo el enfoque Orientado a Objetos El enfoque orientado a objetos es ms abstracto y se adeca mejor a aplicaciones complejas Se definen Clases a partir de las que se crean objetos (que se utilizarn en los programas) Cada clase tiene un conjunto de atributos y mtodos Las principales caractersticas de los lenguajes OO son: Encapsulamiento, Herencia y Polimorfismo