Compilación de Programación Orientada A Objetos
Compilación de Programación Orientada A Objetos
Compilación de Programación Orientada A Objetos
CARACTERSTICAS En la programacin tradicional, los programas constan de procedimientos y datos; donde cada procedimiento acta como una caja negra que realiza una tarea especfica sin preocuparse de lo que hace internamente. En la programacin orientada a objetos, en cambio, los programas se dividen en entidades independientes que se relacionan con otras partes del programa, en donde cada entidad se considera un objeto. CLASE.- Es un tipo de dato abstracto definido por el usuario, es decir un modelo o plantilla para describir uno o varios objetos. Es el tipo de dato. En la clase se definen los datos y mtodos que utilizarn los objetos. OBJETO. - Es la instancia de una clase que se caracteriza por los datos que son los atributos y por los mtodos que definen el comportamiento de ese objeto. Es la variable. Tanto los mtodos como los datos estn ocultos y nicamente son manipulados por mensajes. MTODOS.- Definen la forma como tiene que actuar un objeto cuando recibe un mensaje ya sea para: 1. Almacenar informacin en los datos o para 2. Manipular dichos datos. Los mtodos realizan actividades importantes como: 1. Crear objetos. 2. Procesar la informacin con los datos miembro. 3. Destruir objetos para liberar memoria. MENSAJES.- Es la peticin que se hace a un objeto para que se comporte de una manera especifica ejecutando uno de sus mtodos. Es la llamada a las funciones o mtodos y consta de tres partes importantes. OBJETO RECEPTOR.- Quien va a ejecutar la tarea FUNCIN.- Lo que va hacer el objeto. PARMETROS.- Los valores que se envan. HERENCIA .- Tambin llamada Derivacin de Clases, significa definir una clase a partir de otra que ya creada, en otras palabras se comparte automticamente los
datos y mtodos de la clase base. Esto permite sirve para reutilizar cdigo y hacer programas extensibles. POLIMORFISMO.- En su forma ms simple significa varias formas y hace referencia al hecho de que diferentes objetos pueden reaccionar al mismo mensaje de modo diferente. Es un concepto relacionado directamente con herencia. CARACTERSTICAS DE LA P.O.O. 1. Los objetos son paquetes compactos que no se rompen al aadir otros. Si un objeto nuevo tiene errores quedar aislado del resto. 2. Un lenguaje orientado a objetos soporta datos abstractos, herencia y polimorfismo. 3. Gracias a la herencia los objetos nuevos pueden derivarse de los viejos que estn funcionando correctamente. El polimorfismo permite reutilizar diseos existentes y crear programas extensibles. 4. La abstraccin y ocultacin de datos reduce la dependencia entre los mdulos es decir los objetos no pueden ser accesados desde el exterior. 5. Los datos miembros de un objeto definen su estado actual y los mtodos definen su comportamiento. Ambos estn encapsulados. 6. Los objetos pueden comunicarse con otros enviando o pasando mensajes a travs de sus mtodos, cada objeto sabr que hacer con los mensajes que recibe. HISTORIA DE LOS LENGUAJES ORIENTADOS A OBJETOS Los lenguajes orientados a objetos empiezan en los aos 50 con un programa llamado LISP. Los lenguajes orientados a objetos se dividen en: puros e hbridos. LENGUAJES PUROS.- Son aquellos que estn implementados de tal forma que toda su implementacin obedece a los conceptos y caractersticas de la programacin orientada a objetos. Algunos de estos lenguajes son el Smalltalk, Eiffel, Actor, etc. LENGUAJES HIBRIDOS.- Son aquellos que manipulan determinados conceptos orientados a objetos y los combina con la programacin estructurada tradicional. Entre estos lenguajes se destacan Objetive-C, Objetive-Pascal, Turbo Pascal y C++. EVOLUCIN DE LOS LENGUAJES ORIENTADOS A OBJETOS LENGUAJE ENSAMBLADOR.- Permiti que ya no se trabaje en cdigo binario sino con palabras determinadas.
LENGUAJE DE ALTO NIVEL.- Permiti resolver problemas un poco ms complejos pero no permita realizar programas ms grandes y elaborados. LENGUAJE DE PROCEDIMIENTOS.- No es lo mismo que el lenguaje estructurado. Los datos y los procedimientos son completamente independientes y aqu encontramos lo llamado caja negra. LENGUAJE ESTRUCTURADO.- Se puede definir un mdulo dentro de otro por medio de estructuras. LENGUAJE ORIENTADO A OBJETOS.- La esencia tanto de los datos como de los procedimientos que actan sobre dichos datos se agrupan bajo una misma estructura determinada. Permite mejor organizacin de cdigo y ste es transparente. EVOLUCIN DE LAS TCNICAS DE PROGRAMACIN PROGRAMACIN LINEAL.- Es una programacin secuencial. Lnea tras lnea sin lazos de repeticin. Solo para programas menores a cien lneas de cdigo. Haba duplicidad de segmentos de cdigo. PROGRAMACIN MODULAR.- Es una programacin en mdulos que no podan ser modificados. Consiste en realizar las partes de un todo en forma separada y despus unirlos para resolver el problema principal. PROGRAMACIN ESTRUCTURADA.- Se tiene procedimientos anidados que resuelven problemas por medio de estructuras determinadas. PROGRAMACIN ORIENTADA A OBJETOS.- Se basa en tipos abstractos de datos que son las clases. PROGRAMACIN VISUAL.- Es la programacin que hace uso de componentes una interfaz grfica que utiliza todas las potencialidades que brinda el ambiente grfico como son botones, mens, iconos, etc. PROGRAMACIN ORIENTADA A OBJETOS FRENTE A LA PROGRAMACIN TRADICIONAL Algunas de las diferencias ms importantes entre estos dos paradigmas estn definidos en los siguientes aspectos: creacin de entradas mltiples, abstraccin de datos, organizacin del cdigo, desarrollo de programas, entre otras. HISTORIA DEL C++ .Fue desarrollado a inicios del ao 1980 por el Dr. Djarne Stroustrup en los laboratorios BELL de AT&T. Este lenguaje tiene su origen en los lenguajes: Algol 98 y Simula 67. Inicialmente se le conoca como C con clases.
Permita la manipulacin de algunos recursos como son: Abstraccin de datos.- Para poder modelar tipos de datos. Tipificacin de datos.- Verifica la correcta declaracin de los tipos de datos. Paso de argumentos por referencia.- Enva argumentos por medio de sinnimos. Limpieza automtica de memoria.- Define destructores por defecto Sobrecarga.- Cuando una funcin o un operador realicen ms de una tarea de acuerdo al contexto en el cual son utilizados. Plantillas(Template). Son modelos que permiten especificar datos complejos. Excepciones.- Define el alcance de trabajo de las funciones. Conversin de tipos.- Para lograr la transformacin entre los diferentes tipos de datos. SOPORTE DE LA PROGRAMACIN O.O. EN C++ El lenguaje C++ soporta todos los conceptos establecidos como son: Abstraccin.- Para declarar las clases se utiliza la palabra class. Encapsulacin.- Datos y mtodos bajo una misma estructura. Ocultacin de los datos (acceso). Por medio de los mensajes se accesa a los datos y mtodos. Herencia.- Simple y mltiple. Polimorfismo.- Por medio de la declaracin de funciones virtuales. CREACIN DE UN PROGRAMA EN C++ 1. Edicin del Programa.- Digitar el cdigo del programa. 2. Compilacin.- Bsqueda de los errores en el cdigo respectivo. 3. Enlace.- Se establece la forma en que se comunican las libreras con el programa principal. Cada librera se compila independientemente y en el orden que se establece con las libreras INCLUDE. 4. Ejecucin. - Hace referencia a la corrida del programa. ORIENTACIONES PARA EL TRABAJO CON LAS DIFERENTES FUENTES Para la familiarizacin de los contenidos, del libro gua lea detenidamente el Captulo I de la pgina 1 a la 26. Centre su atencin en los temas y subtemas que son parte del ndice de la unidad.
CLASES Concepto de claseUna clase es un tipo de dato definido por el usuario que consta de dos elementos: la interfaz y la implementacin:
Sintaxis.La definicin de una clase obedece al siguiente formato: class nombre_clase{ // Cuerpo de la clase } lista de variables ; Donde: Nombre_clase .- es un nombre vlido que no sea una palabra reservada o no contenga caracteres especiales. El cuerpo de la clase.- comprende los datos y funciones miembro agrupados en bloques que estn delimitados por especificadores de acceso.
La lista de variables.- es opcional, y representa los objetos de la clase definida. Esta declaracin se puede realizar en cualquier otro lugar del programa dependiendo del alcance que se quiera dar a dichos objetos, es decir local o global. Datos Miembro.- Son los atributos a caractersticas de la clase y pueden ser variables de cualquier de los tipos estndar de C como: int, float, char, etc. o tipos compuestos como estructuras, arreglos, u objetos de otras clases. Funciones miembro (mtodo). Son las funciones que definen el comportamiento de la clase y el acceso a los datos miembros. Especificadores De Acceso Entre los especificadores de acceso estn: public Los miembros pblicos pueden ser accesados desde el exterior de la clase private Puede ser accesados nicamente por miembros propios de la clase o por los miembros de clases amigas. protected Los miembros protegidos pueden ser accesados por los miembros
propios de la clase, de clases amigas y por miembros de las clases derivadas. Ejemplo: #include <iostream.h> #include <conio.h> class numeros{ private: int entero; float flotante; char cad[10]; public: int leer_entero(); float leer_flotante(); char *leer_cadena(); void escribir(); }; Si se omite un especificador de acceso el lenguaje los considera como miembros privados (private). Algunas de las consideraciones a tener en cuenta para la definicin de una clase son las siguientes: 1. Primero declarar los datos miembro y luego los mtodos. 2. Todos los datos miembros declararlos como privados y aquellos mtodos (funciones miembros) que van a ser invocados en el exterior declararlos como pblicos. 3. Aunque se pueda declarar los objetos inmediatamente despus del cuerpo de la clase, es mejor declararlos en el cuerpo de la funcin principal, es decir en el lugar donde sern utilizados.
ENTRADA Y SALIDA ESTANDAR.Una de las ventajas ms importantes del lenguaje C++ y a la vez diferencia con su antecesor, el lenguaje C, es la incorporacin de los objetos cin y cout para las operaciones de entrada y salida de datos. Para la entrada de datos se usa el objeto cin>>, que significa get in y toma el flujo del teclado. Ejemplo: int p,q; cin>>p; cin>>p>>q; Para la salida de datos se usa el objeto cout<<, que significa put in y pone el contenido de una variable en el monitor. Ejemplo:
Existe un manipulador endl a ms de insertar un salto de lnea, limpia el buffer. NOTA: Los objetos cin y cout estn dentro de la librera iostream.h, razn por la cual esta librera debe incluirse como archivo de cabecera para poder implementar las operaciones de entrada y salida.
IMPLEMENTACIN DE UNA CLASE La implementacin de una clase comprende el cdigo de las funciones miembros definidas en la respectiva interfaz. La sintaxis para definir las funciones miembros es: tipo nom_class:: nombre del mtodo(){ //Cuerpo de la funcin } Ejemplo. Si tomamos como punto de partida la clase numeros del ejemplo anterior, las funciones se podrn implementar de la siguiente forma: int numeros::leer_entero(){ cout<< Dato entero:; cin>> entero; return entero; } float numeros::leer_flotante(){ cout<< Dato flotante:; cin>> flotante; return flotante; } char *numeros::leer_cad(){ cout<< Cadena:; cin>> cad; return cad; } void numeros::escribir(){ cout<< Entero:<<entero; cout<< Flotante:<<flotante; cout<< Cadena:<<cad; }
main(){ numeros obj; // declaracion del objeto obj de tipo numeros int res; float real; clrscr(); cout<<obj.leer_entero(); cout<<obj.leer_flotante(); cout<<obj.leer_cad(); obj.escribir(); getch(); } CLASES Y ESTRUCTURAS An cuando las clases y las estructuras tienen una sintaxis muy similar existen algunas diferencias por definicin como por ejemplo que una estructura no posee especificadores de acceso, adems una estructura puede ser definida dentro de una clase pero una clase no puede definirse dentro de una estructura.
CLASES ESTRUCTURAS Datos miembro Datos Funciones miembro Funciones Especificadores de acceso FUNCIONES MIEMBRO EN LNEA (inline) El cdigo no se encuentra en la implementacin sino en la interfaz de la clase. Para declarar en lnea las funciones deben ser bsicas. No se puede declarar una funcin en lnea cuando se utiliza un switch, goto y return. La funcin en lnea no es una orden sino una peticin. No pude haber en lnea funciones recursivas. Existen dos formas de declarar una funcin en lnea: 1. Declarar el cdigo de la funcin en lnea en el momento de la declaracin de la clase. 2. Utilizando la palabra reservada inline en la implementacin antes de la definicin de la funcin.
REFERENCIAS.- Son una nueva forma de referirse a un objeto ya que permite definir un sinnimo de dichas instancias. Las referencias son similares a un puntero ya que permiten establecer una forma alternativa de manipularlos, sin embargo una referencia utiliza el ampersand (&) en lugar del asterisco (*).
Ejemplo: point pt1 ; pt1.set(10,5); // seteo x e y del objeto p1 point &pt2 = pt1; // p2 es un sinnimo de p1 pt2.escribir(); // se imprimir x=10 y=5 Cuando se crea una referencia no se crea una copia del objeto sino otro nombre para el objeto. La regla ms importante para el uso de referencia es inicializarla con un objeto que ya existe. point &pt3; // error : referencia no incializada int x=10; int &ini =x; // ini es una referencia
sinnimo
de
x +=10; ini +=10; hacen lo mismo Se puede tener cualquier nmero de referencias para un valor. int z, &y1=x, &y2=x; z = y1 + y2; cout<<z; // 20 ARGUMENTOS POR REFERENCIA PASO DE PARMETROS POR VALOR (NOMBRE) nicamente se crea una copia de los argumentos que se envan en los parmetros de la funcin, por lo tanto cualquier modificacin interna no modifica a las variables originales. Ejemplo: int suma(int x, int y){ return x+y; } cout<<suma(10,20); PASO DE PARMETROS POR DIRECCIN Enva argumentos de tipo puntero que son las direcciones de memoria de las variables originales, por lo tanto cualquier modificacin interna afecta a las variables originales.
Ejemplo: void cambiar(int *x, int *y){ int aux = *x; *x = *y; *y = aux; } llamada: int a=5, b=10; cambiar(&a, &b); ARGUMENTOS POR REFERENCIA(PARMETROS) Se enva la referencia de los argumentos (sinnimos) por lo tanto todo cambio interno se refleja en los datos enviados. Ejemplo: void cambio(int &x, int &y){ int aux =x; x = y; y = aux; } llamada: int a=12, b=3; cambiar(a, b);
REFERENCIAS CONTRA PUNTEROS Dado que un puntero maneja la direccin de memoria de una variable, es posible manipular su localidad y contenido, pero con una referencia solo podemos utilizar el contenido. En cambio con una referencia solo se refiere al dato respectivo por lo tanto cualquier operacin sobre la referencia tambin se aplica sobre el valor referenciado. Ejemplo: int x =10, *pt; pt = &x; // asigno la direccin de x al puntero pt (*pt)++; cout<< *pt; // se imprime 11 int x =2; int &ref =x; ref +=2; cout<<x; // se imprime 4 CONSTRUCTORES Y DESTRUCTORES
CONSTRUCTORES.- Un constructor es una funcin miembro especial de una clase que se utiliza para crear e inicializar un objeto de esa clase. Caractersticas: 1. El constructor tiene el mismo nombre de la clase a la que pertenece. 2. Un constructor no puede retornar un valor pero si puede tener parmetros para inicializar los datos miembro de la clase. 3. Los constructores son nicos para cada clase, por lo tanto no pueden ser heredados. 4. Cuando una clase tiene un constructor este ser invocado automticamente siempre que se cree un nuevo objeto. Ejemplo: #include <iostream.h> class fecha{ int dia, mes, anio; public: fecha(int dd, int mm, int aa); //constructor void escribir(); }; // Implementacin de las funciones miembro fecha::fecha(int dd, int mm, int aa){ dia = dd; mes = mm; anio = aa; } void fecha::escribir(){ cout<<dia<< - <<mes<< - <<anio<< \n; } main(){ fecha hoy(8,11,1999); hoy.escribir(); // Salida: 8 - 11 - 1999 } Cuando una clase no tiene constructor el compilador crea automticamente uno y lo inicializa dependiendo del lugar donde haya sido declarado el objeto, de la siguiente manera: Objeto local : inicializa con valores no definidos. Objeto global : inicializa con cero los datos miembro. Para inicializar un objeto de varias formas se debe declarar varios constructores aplicando el concepto de funciones sobrecargadas. FUNCIONES SOBRECARGADAS.- Son un grupo de funciones que tienen el mismo nombre y diferentes tipos de parmetros. Este concepto puede ser aplicado no solo se aplican con constructores sino tambin con funciones externas. Cuando una clase tiene ms de un constructor el compilador invoca el constructor de acuerdo a los argumentos de dichos objetos para ejecutar aquel que coincida en nmero, tipo y orden de los parmetros.
ARGUMENTOS POR OMISIN O POR DEFECTO.Permiten omitir argumentos que se envan a una funcin miembro cuando no se decide especificar el valor de alguno de ellos. El valor predeterminado para los argumentos se establece en la declaracin de la funcin miembro. Ejemplo: class point{ int x,y; public: point(int xval = 0, int yval = 5){ x = xval; y = yval; } }; Cuando no se especifica los parmetros se usan los parmetros por defecto. point p1(); (0,5) point p2(3,8); (3,8) point p3(4); (4,5) CONSTRUCTOR COPIA.- Es un constructor que crea e inicializa un objeto a partir de otro ya existente. Este tipo de constructores comparten las mismas caractersticas generales definidas para los constructores Se diferencia de otros constructores porque tiene como parmetro un solo argumento que es una referencia al objeto que se enva al constructor y a partir del cual se inicializarn los datos del nuevo objeto. Sintaxis: nom_class::nom_class(const nom_class &obj); El objeto que se enva como argumento debe ser de la misma clase. Ejemplo: class point{ int x,y; public: point(int xval = 0, int yval = 0){x = xval; y = yval;} point(point &ob); //constructor copia. }; point::point(point &ob){ // este constructor inicia un objeto a partir de ob x = ob.x; y = ob.y; } llamada: point a, b(10, 5); // se crean 2 objetos: a y b point c(b); // inicia c a partir del objeto c ALMACENAMIENTO DINMICO.-
Es un proceso que permite la administracin de memoria en tiempo de ejecucin de una aplicacin y no de compilacin. Consiste principalmente en solicitar un espacio de memoria determinado acuerdo a los requerimientos del programa. Para lograr este objetivo en los lenguajes C y C++ se utilizan las siguientes funciones:
Para la asignacin dinmica de memoria, en el lenguaje C se utilizan 2 funciones: malloc.- Devuelve un puntero genrico a la primera posicin de memoria reservada. Tiene como argumento el espacio que se desea reservar y devuelve la direccin de memoria del primer byte del espacio reservado que debe asignarse a un puntero. Ejemplo: int *p; p=(int*)malloc(10*sizeof(int)); free.- Esta funcin es complementaria a malloc y libera la memoria reservada. Tiene como parmetro el puntero al cual fue asignada la memoria por malloc. Ejemplo: free(p); En C++, se utilizan los siguientes operadores: new.- Devuelve un puntero de tipo void que es compatible con cualquiera de las tipos estndares. Ejemplo: int *p; p = new int [10]; cin>>n; p = new int [n]; delete.- Libera la memoria reservada por new. Ejemplo: delete p; DESTRUCTORES.- Es una funcin miembro de una clase que permite liberar la memoria utilizada por un objeto de dicha clase.
Caractersticas: 1. No retorna ningn valor y tiene el mismo nombre de la clase antecedido por el smbolo ~ (ligulilla). 2. No tiene argumentos. 3. Cada clase debe tener un solo destructor. 4. El destructor tiene caractersticas propias por lo tanto no es heredado. Sintaxis: nom_class:: ~nom_class(); El destructor se invoca automticamente cada vez que el objeto sale de su mbito, es decir el lugar donde ha sido declarado. FUNCIN EXTERNA.- Es aquella funcin que no pertenece a una clase. PUNTERO THIS.- Es un puntero implcito que no es necesario definirlo ya que se crea cada vez que se define una clase. Devuelve un puntero a una clase. Ejemplo: Programacin II Ing Jhonny Barrera J. MsC Universidad Tecnolgica Amrica 30 void point:: (){ cin>>x; cin>>y; } void point:: (){ cin>>this x; cin>>this y; } Aplicaciones del puntero this.1. Cuando se quiere trabajar con miembros de una clase que utiliza estructuras dinmicas (enlaces). 2. Para pasar un puntero al objeto asociado con la invocacin de la funcin miembro. point punto; punto.cambiar(this); 3. Para hacer una copia del objeto que invoca a la funcin miembro o para asignarle un nuevo valor. void clase_a::funcion(claseA &a, claseA &b){ a = *this; *this = b; } El puntero this hace referencia al objeto que llama la funcin.
4. Para referenciar explcitamente a un dato miembro de una clase que tenga el mismo nombre que el de un parmetro en una funcin miembro. class point{ int x, y; public: point(int xval = 0, int yval = 0) {x = xval; y = yval;} //o tambin point(int x =0, y =0 ){this x =x; this y =y;} 5. Cuando se devuelve una referencia en una funcin miembro o el constructor. class point{ int x, y; public:
return *this; }
AMIGAS FUNCIONES AMIGAS.Por definicin una clase tiene sus datos miembros en la clase privada por tal razn la nica forma de acceder a dichos datos es utilizando las funciones miembro de dicha clase. Sin embargo cuando se desea acceder a la parte privada de una clase por medio de una funcin o una clase que no tiene nada que ver con la primera se utiliza la designacin friend (amiga).
FUNCIN EXTERNA COMO FRIEND.- Una funcin externa (funcin independiente que no pertenece a ninguna clase) puede acceder a la parte privada de una clase al ser declarada como friend o amiga de esa clase. Su declaracin se la hace en la interfaz de la clase anteponiendo la palabra friend y la implementacin hace referencia a una funcin normal.
Ejemplo: class vector{ int *p; int num; public: vector(int n = 1){num = n; p =new int[num];} vector(vector &v); friend void leer(vector &vec); }; void leer(vector &vec){ cout<< los elementos son:\n; for(int i = 0;i<vec.num;i++){ cout<< El elemento:<<i<< :; cin>>vec.p[i]; } } llamada: vector a(5); leer(a); //funcin externa cout<<a.num; //mal
FUNCIN MIEMBRO DE UNA CLASE COMO FRIEND DE OTRA CLASE Una funcin miembro de una clase puede acceder a la parte privada de otra clase declarndose como amiga, para eso es necesario hacer una declaracin forwart o adelantada. UNA CLASE COMO FRIEND DE OTRA CLASE Cuando se declara una clase A como amiga de una clase B todas las funciones miembros de A pueden acceder a los datos privados de la clase B. MIEMBROS STATIC DE UNA CLASE Cada objeto tiene sus propios datos miembro pero solo existe una copia de las funciones miembro para manipular dichos datos. Cuando se necesita declarar un miembro asociado con la clase y no con los objetos de esa clase se utiliza la palabra static anteponiendo a la declaracin del identificador, o sea antes del dato o funcin miembro. Un miembro static ocupa una zona fija de almacenamiento que es asignada en tiempo de compilacin. Dato miembro static 1. Existir una sola copia de ese dato en todos los objetos de la clase por lo tanto ser compartido.
2. De forma general es una variable asociada con la clase y no con los objetos de la misma. 3. Se declara en la clase utilizando la palabra static y deben ser inicializados fuera de la definicin de la clase como variable global as: tipo nombre_clase::miembro = valor; Funcin miembro static 1. Una funcin miembro static solo puede acceder a otras funciones a datos miembros static pero o puede manipular datos no static, a diferencia de las funciones normales o no static que si puede acceder a los datos miembro static. 2. Las llamadas se realizan utilizando el nombre completo de la clase, resolucin de mbito (::) y el nombre de la funcin miembro independientemente de que existe o no un objeto de esa clase. nombre_clase::funcin_miembro() De forma general las funciones static son utilizadas normalmente para actuar globalmente sobre todos los objetos de una clase. ARREGLO DE OBJETOS.- Un arreglo de objetos es una estructura que contiene un conjunto de objetos de la misma clase. Su forma de trabajo (acceso, manipulacin) tiene un criterio parecido a un arreglo de estructuras es decir cada posicin en el arreglo empezando desde cero contendr su respectiva copia de los datos miembros y todos los objetos compartirn una sola copia de las funciones miembro. Cuando la clase tiene un constructor este ser invocado por cada uno de los objetos del arreglo, y si no lo tiene el compilador crear uno que inicializar los valores a cero cuando el arreglo es global y con valores desconocidos cuando es local. Nota.- Si la clase tiene un constructor se recomienda por funcionalidad que el constructor inicialice los valores automticamente en lugar de solicitar datos al usuario ya que si el arreglo es numeroso tendr que ejecutarse tantas veces sea el tamao del mismo. Ejemplo: class point( int x, y; public: point(int x1 = 0, int y1 = 0){x = x1; y = y1;} void drawpoint(){gotoxy(x, y); cout<< .;;} void addpoint(int x1, int y1){x + = x1; y + = y1;} void visualizar(){cout<<x; cout<<y; } void cetpoint(); };
void point::setpoint(){ cout<< Ingrese x:; cin>>x; cout<< Ingrese y:; cin>>y; } point puntos[10] = {2, 4, 6,.....}; puntos[4]. visualizar(); puntos[3]. setpoint(); Creacin dinmica 1. Como un puntero a un arreglo de objetos. notas *alumnos[100]; for(k = 0; k< 100; k++) alumnos[k]=new notas; 2. Almacenamiento dinmico de memoria notas *alumnos; alumnos = new notas[100];
SOBRECARGA Es un mecanismo por medio del cual se logra que un elemento (funciones y operadores) se comporte de varias formas de acuerdo al contexto donde se aplique y utilice. SOBRECARGA DE UNA FUNCIN.- Son varias funciones que tienen el mismo nombre mientras el nmero y nombre de parmetros son diferentes. En el momento de la llamada el compilador compara los argumentos con los parmetros para ejecutar la funcin que concuerde. Ejemplo: overload mayor; // versiones anteriores de C int mayor (int x, int y){ return x>y?x:y; } double mayor (double x, double y){ return x>y?x:y; } char *mayor (char *x, char *y){ return strcmp (x,y)>0?x:y; } llamada cout<< Mayor valor:<<mayor(3.4, 2.7); cout<< Mayor valor:<<mayor(uno, dos);
El concepto de sobrecarga se puede aplicar a las funciones de una clase permitiendo que una funcin miembro se comporte de varias formas. Un ejemplo clsico de esto son los constructores. class datos{ //...... //...... public: int mayor (int x, int y){ return x>y?x:y; } double mayor (double x, double y){ return x>y?x:y; } char *mayor (char *x, char *y){ return stremp (x,y)>0?x:y; } }; int datos::mayor (int x, int y){ return x>y?x:y; } OPERADORES SOBRECARGADOS.Un operador sobrecargado es aquel que puede desarrollar su accin en varios contextos diferentes sin necesidad de otras operaciones adicionales. Se asocia a un operador estndar una accin con el fin de que su llamada sea de acuerdo a los operadores que se utiliza, es decir cuando se sobrecarga un operador se define una nueva funcin. Sintaxis: tipo operator operator (parmetros); Donde: tipo Es el tipo de dato del valor que devuelve la funcin. operator operador Que se constituyen como el nombre de la funcin. parmetros Son los valores que se enva a la funcin. Operadores:
Nota: Todos los operadores sobrecargados se heredan en cualquier clase derivada a excepcin del operador de asignacin. Binario: Debe haber un argumento cuando la funcin de sobrecarga se define como miembro de la clase y dos argumentos cuando se define como una funcin amiga o global. Unario: La funcin de sobrecarga no tiene argumentos cuando se declara como miembro de la clase y tiene un argumento cuando se declara como funcin amiga o global. El compilador por defecto sobrecarga el operador de asignacin. p=p1*p2; punto operator *(punto p1){ return punto(x*p1.x, y*p1.y); } p=4*p1; friend punto operator *(int n, punto p){ return punto(n*p.x, n*p.y); } p=p1*3; friend punto operator *(punto p, int n){ return punto(n*p.x, n*p.y); } SOBRECARGA DEL OPERADOR NEW Y DELETE Para sobrecargar estos operadores se utilizan las siguientes funciones ya definidas. memset.- Tiene como objetivo en dar un valor a una porcin de memoria con un carcter especfico dado el tamao. Se encuentra en la librera string.h. memset(punt.inicio, car, tamao bytes); Ejemplo: char *p; memset(p, -, 20); size_t.- Nos da el tamao en bytes de un tipo definido y se encuentra en la librera stdio.h. Estas dos funciones utilizarn la funcin malloc para pedir memoria.
Para sobrecargar el operador delete se utilizar la funcin free. SOBRECARGA DEL OPERADOR DE INDEXACIN O SUBINDICE [] .La sobrecarga de este operador nos permite interpretar un objeto como un arreglo. La ventaja ms importante de sobrecargar este operador radica en que el ndice puede ser cualquier tipo de dato. Esta funcin sobrecargada debe ser miembro de
la misma clase del objeto que invocar a la funcin. En la llamada el argumento ir entre los corchetes. tipo operator[](argumento) Nota: Debe ir un solo argumento y puede devolver cualquier tipo de dato. Ejemplo: class datos{ public: int operator[](char car); }; int operator[](char car){ return(int)car; } main(){ char let; datos obj1, obj2[10]; cout<< Ingrese una letra; cin>>let; cout<< El cdigo de:<<let<< es<<obj1[let]; } SOBRECARGA DEL OPERADOR DE LLAMADA A FUNCIN ( ).La sobrecarga de este operador permite enviar varios argumentos a un objeto determinado. Debe ser funcin miembro de la misma clase del objeto que invoca a la funcin. La llamada se hace por medio del objeto de la clase seguida de los argumentos entre parntesis. tipo operator() (argumentos) Ejemplo: void operator() (int val, double d); void operator() (); llamada obj1[10]; obj2(10, 4.2); obj2. Operator() (10,4.2);
SOBRECARGA DEL OPERADOR DE ENTRADA(>>) Y SALIDA (<<) C++ tiene definido por defecto en la librera iostream.h las clases ostream e istream que contienen las funciones miembro para imprimir y leer respectivamente cualquiera de los timpos de datos estnderes conocidos por medio del operador de salida << y por medio del operador de entrada en base a estas definiciones extisten dos objetos genricos para manipular datos los mismos que son cout y cin.
La definicin de las clases indicadas tiene la siguiente estructura. class ostream{ public: ostream & operator<<(char*); ostream & operator<<(int); ostream & operator<<(double); }; ostream cout; class istream{ public: istream & operator<<(char*); istream & operator<<(int); istream & operator<<(double); }; istream cin; Por el hecho de que estos operadores se encuentran ya definidos en sus clases respectivas, para sobrecargarlos se debe utilizar una funcin friend para cada caso que me devuelva una referencia al objeto de entrada o salida de acuerdo al caso. HERENCIA Se conoce tambin como herencia al mecanismo por medio del cual una nueva clase llamada clase derivada se define a partir de una clase ya existente (clase base) sin necesidad de volver a escribir su cdigo. La clase derivada puede contener nuevos miembros a ms de los que contiene la clase base, adems puede ocultar o redefinir cualquiera de las funciones miembro de la clase base.
CARACTERSTICAS DE LAS CLASES DERIVADAS 1. Una clase derivada puede ser a su vez una clase base dando lugar a una jerarqua de clases. 2. La clase derivada hereda todos los miembros de la clase base pero solo puede accesar a los miembros pblicos (public) y protegidos (protected) de la clase o clases bases de las cuales hereda. Una clase derivada no puede accesar a los miembros privados (private) de una clase base. 3. Una clase derivada puede tener a ms de los miembros heredados sus propios datos y funciones miembro. 4. Los miembros heredados por una clase derivada pueden a su vez ser heredados por ms clases derivadas de ella. Sintaxis: class nom_clas_deri:<public/private> nom_clas_base{
//Datos y funciones miembro de la clase derivada }; Donde: nom_clas_deri Es el nombre de la clase derivada. <public/private> Puede ir como no puede ir. Si no va ninguno de los dos por defecto ser private. public: Los miembros heredados conservan el tipo de acceso que tienen en la clase base. private: Independientemente del tipo de acceso que hayan tenido en la clase base, los miembros pasan a ser privados en la clase derivada. La palabra protected no puede ser colocada antes del nombre de la clase base. Ejemplo: class figura{ protected: float radio; public: void leer_radio(); void rea(); friend ver_radio(); }; class cilindro:public figura{ float altura; public: void rea(); void volumen(); friend void ver_altura(); }; Nota: Para acceder a los miembros pblicos de una clase base utilizando un objeto de la clase derivada hay que definir la clase base como public.
FUNCIONES FRIEND (HERENCIA) 1. Si hay una funcin friend de una clase base solo podr acceder a los miembros de la clase base. 2. Si hay una funcin friend de la calse derivada podr acceder a los miembros pblicos y protegidos de la clase base y a los miembros propios de la clase derivada.
Conclusin: Cuando se define una clase base cuyos datos miembros se requieren que sean manipulados por una clase derivada se deben define como protegidos (protected).
ACCESO A LOS MIEMBROS DE UNA CLASSE DERIVADA El acceso se realiza de la misma forma que a los miembros de cualquier otra clase. nombre_del_objeto.nombre de la funcin miembro Pero se debe tener en cuenta las siguientes consideraciones: 1. Si un miembro heredado tiene el mismo nombre que un miembro de la clase derivada. 2. Que un miembro heredado de una clase base tiene el mismo nombre de otro miembro heredado de otra clase base. En estos casos se resuelve anteponiendo el nombre de la clase a la que pertenece el miembro, caso contrario el compilador genera un error. 1. void derivada::leer_num(){ cin>>derivada::num; cin>>base::num;}
ACCESO A LOS MIEMBROS DE LA PARTE PRIVADA DE LA CLASE BASE Por definicin se sabe que no se puede acceder a los miembros privados de una clase, pero cuando se utiliza herencia, se requieren muchas veces que las clases derivadas accedan a la parte privada de la clase base, para lo cual se establecen tres formas: 1. Por medio de clase derivada friend de la clase base. class figura{ float radio; public: void leer_radio(); void imprimir_radio(); friend class cilindro(); }; class cilindro:public figura{ float altura, rea; public: void leer_altura(); void imprimir_altura(); void cambiar_radio(); } Si se define a la clase derivada como friend de la clase base, todos los miembros de dicha clase podrn acceder a los datos privados de la clase base. 2. Declarando protected a los miembros privados de la clase base. Cuando se declara protected a l os datos miembros de una clase, dichos datos unicamente podrn ser accesados por las funciones miembro de la clase derivsda y se comportarn como privados para el resto de clases y funciones externas. class figura{
protected: float radio; public: void leer_radio(); void imprimir_radio(); }; class cilindro:public figura{ float altura, rea; public: void altura(); }; 3. Mediante funciones propias de la clase base. Consiste unicamente en que las funciones miembros de una clase derivada contengan como parte de su cdigo una llamada a una funcin miembro de la clase base que manipule datos de la parte privad de ella. class figura{ float radio; public: void leer_radio(); void imprimir_radio(); float devradio(){return radio;} }; class cilindro:public figura{ float altura, rea; public: void leer_altura(); void imprimir_rea(); void rea(figura f); }; void cilindro::rea(figura f){ rea=2*pi*f.devradio()*h+pi*pow(2,f.devradio()); }
CONSTRUCTORES Y DESTRUCTORES EN CLASES DERIVADAS Los contructores y destructores de la clase base no son heredados por las clases derivadas. CONSTRUCTORES EN CLASES DERIVADAS.- Se definen para cada clase derivada y cuando se declara un objeto de dicha clase se ejecuta primero el constructor de la clase base, entonces se ejecuta el constructor de la clase
derivada. Este procedimiento asegura que todos los datos miembros que son heredados de la clase base sean inicializados tambin en la clase derivada. Sintaxis:
nom_clase_deriv::nom_clase_deriv(parmetros clase_deriv):nom_clase_base (parmetros clase base){ //cuerpo del constructor //..... }
Ejemplo: class figura{ protected: float radio; public: figura(float r=0){radio=r;} void leer_radio(); void ver_radio(); }; class cilindro:public figura{ float altura; public: cilindro(float a=0):figura(a){altura=a;} void rea(); void volumen(); };
Un constructor en una clase derivada consta de dos partes: 1. La inicializacin de la clase derivada. 2. La inicializacin de la clase base.
INICIALIZACIN CON CONSTRUCTORES COPIA Una clase derivada puede inicializarse a partir de otro objeto ya creado de la misma clase utilizando el constructor copia, as mismo un objeto base puede ser inicializado a partir de un objeto de una clase derivada. DESTRUCTORES.- Se definen de la misma forma que para una clase normal y se ejecutan de forma inversa que a los constructores. HERENCIA SIMPLE
La herencia simple se tiene cuando una clase derivada es heredada de una sola clase base.
Ejemplo:
HERENCIA MLTIPLE Es el mecanismo por medio del cual se puede definir una clase derivada a partir de ms de una clase base, ello implica que la clase derivada heredar (tendr como parte de s misma) todos los miembros de cada una de las clases base que tenga, en tal virtud la clase derivada podr manipular a ms de sus datos y funciones miembros todos aquellos datos y funciones miembro que heredo de acuerdo al nivel de acceso de las clases base. Todas las reglas definidas para los constructores y destructores as como para los niveles de acceso en herencia simple se aplican literalmente cuando se trata de herencia mltiple. Ejemplo:
CLASES VIRTUALES.- Cuando se trabaja con herencia mltiple puede haber casos en los cuales existe derivacin ambigua lo cual implica que una clase derivada puede en un momento dado llegar a heredar datos y funciones miembro de una misma clase base, lo cual generara un error. Para salvar esta situacin y evitar posibles errores se declara una clase base como virtual anteponiendo esta palabra en el encabezado de la respectiva clase base esto asegura que en derivaciones posteriores todos los miembros de la clase base definida como virtual sean heredados una sola vez. Ejemplo:
La clase B y C hereda todos los miembros (individualmente) de A. Posteriormente la clase D hereda en forma mltiple de B y C, lo cual implica que los datos y funciones que B y C heredaron de A convergen y vuelven a ser heredados en D. Esto genera un error ya que D esta siendo obligado implcitamente a heredar dos veces los miembros de A.
Para salvar esta situacin se declara a la clase A como virtual en el momento en que definen B y C. FUNCIONES VIRTUALES.- Es una funcin miembro publica o protegida de una clase base que puede ser redefinida en cada una de las clases derivadas de esta, y pueden ser accesadas mediante un puntero o referencia a la clase base. Se declarar en la clase base nicamente anteponiendo a su prototipo la palabra virtual. Las funciones virtuales no son heredadas lo cual implica que cada clase derivada tendr su propia versin de ella. Para redefinir una funcin virtual en una clase derivada, se debe declarar con el mismo nombre, igual nmero y tipo de parmetros y el mismo valor retornado que la funcin virtual de la clase base. De no ocurrir esto dicha funcin ser tratada como sobrecargada. Una funcin virtual es llamada siempre a travs de un puntero o una referencia a la clase base, el compilador identifica la funcin miembro que debe ejecutar de acuerdo al tipo del objeto direccionado. La llamada a una funcin virtual tiene la misma sintaxis que la llamada a una funcin normal. Ejemplo:
1. C++ maneja con mayor flexibilidad la entrada y salida por medio de la sobrecarga de los operadores >> y << lo cual permite que C++ pueda reconocer los tipos definitidos por el usuario. 2. C++ interpreta los archivos como flujos o secuencias de bytes considerando lo siguiente que cin es un flujo asociado con la entrada estndar (teclado) y cout es un flujo asociado con la salida estndar (pantalla) combinados con los operadores << (operador de insercin put in poner en), operador >> (operador de extraccin get from tomar de). LECTURA DE CADENA DE CARACTERES 1. getline() Lee la variable cad mximo de 30 caracteres hasta encontrar \n. Ejemplo: char cad [81]; cin.getline(cad, 30,\n); 2. get() Ejemplo: char car, cad [80]; cin.get(car); cin.get(cad, 30,*); ENTRADA Y SALIDA CON FORMATO La clase iostream mantiene un estado de formato que controla los detalles de entrada y salida. En C++ se puede controlar el formato de la informacin que se ingresa y que se muestra en pantalla de dos formas: 1. Haciendo uso de las funciones miembro de la clase ios
Ejemplo:
#include <iostream.h> main(){ cout.setf(ios::showpos); cout.setf(ios::scientific); cout.setf(ios::uppercase); cout<<21997<< <<2530.35<< \n; cout.precisio(2); cout.width(10); cout<<21997<< <<2530.35<< \n; cout.fill(#); cout.width(12); cout<<21997<< <<2530.35<< \n; } unsetf Desactiva los formatos. 2. Utilizando funciones manipuladoras. Son funciones que se encuentran en la librera iomamip.h y permiten formatear la entrada y la salida.
Ejemplo: #include <iostream.h> #include <iomanip.h> main(){ int ent; cout.setprecision(2)<<123.4567<<endl; cout.setiosflags(ios::showpos); cout.setiosflags(ios::scientific); cout.setiosflags(ios::uppercase); cout<<21997<< <<2530.35<< endl; cout Un entero;cin>>ent; cout<<resetiosflags(ios.showpos); cout<<setw(10)<<setfill(*)<<ent<< \n; }
OPERACIONES DE ENTRADA Y SALIDA DE ARCHIVOS Flujo.- Es la representacin lgica de un archivo. Se utiliza la librera fstream.h. Flujo de Entrada ifstream Flujo de Salida ofstream Flujo Entrada/salida fstream Ejemplo: ifstream en; ofstream sal; fstream ambas; TIPOS GENRICOS PLANTILLAS Las clases y funciones definidas tradicionalmente trabajan nicamente con un tipo especfico de datos, por lo cual cuando se requiere utilizar estas clases o funciones con diferentes tipos de datos, es necesario volver a definirlas aun cuando su cdigo sea similar. Ejemplo: int min(int a, int b){ return a<b:a?b; } double min(double a, double b){ return a<b:a?b; } char min(char a, char b){ return a<b:a?b; } Lo ptimo sera definir una funcin o clase que pueda realizar su operacin con cualquier tipo de dato, sin necesidad de volver a escribir su cdigo para cada situacin, es decir se requiere una funcin o clase polimrfica. Los tipos genricos o parametrizados (templates) permiten construir clases o funciones que se comportan como un patron o plantilla y que permiten al usuario elegir el tipo de dato que necesite a cada momento. Genericidad.- Es la caracterstica que permite definir una clase y funcin genrica sin especificar el tipo de ninguno de sus parmetros, lo cual permite acoplar diferentes situaciones sin tener que reescribirla. FUNCIN GENRICA (PLANTILLA DE FUNCIONES)
Sintaxis: template<parmetros> //Declaracin de la funcin genrica parmetro nom_funcin (lista de parmetros){ //cdigo de la funcin }
Ejemplo: #include<iostream.h> template<class T> T min (T a, T b){ return a<b?a:b; } main(){ int i1=2, i2=6; char c1= A, c2= Z; double d1=1.2e3, d2=3.4e12; cout<< Mnimo int<<min(i1, i2)<<endl; cout<< Mnimo char<<min(c1, c2)<<endl; cout<< Mnimo double<<min(d1, d2)<<endl; }
DEFINICIN DE UNA PLANTILLA DE CLASES Sintaxis: template<parmetros> class nom_clase{ //datos y funciones miembro }; Declaracin de Objetos: nom_clase<tipo> nom_objeto; Ejemplo: #include<iostream.h> template<class T> class vector{ T *p; Int n; public: vector(int num){ p=new T[num]; n=num;} vector(){delete[]p;}
T &operator [](int i){return p[i];} }; main(){ int i; vector<int> a(10); for(i=0;i<10;i++) a[i]=i; for(i=0;i<10;i++) cout<<a[i]<< ; cout<<endl; }
DECLARACIN DE UNA FUNCIN MIEMBRO NO EN LNEA Sintaxis: template<parmetros> tipo nom_clase<param.plantilla> ::nom.funcin(parmetros){ //......... //......... } Ejemplo: template<class T> vector<T>::vector(int n){ //..... //..... } template<class T> T &vector<T>::operator[](int i){ //....... //....... }