Programación Orientada A Objetos Con C++ PDF
Programación Orientada A Objetos Con C++ PDF
La filosofa de la POO (Object Oriented Programming, Programacin Orientada a Objetos) rompe con este esquema, dando lugar a una nueva idea, el objeto. El objeto es una abstraccin en la que se unen sentencias y datos, de tal forma que a un objeto slo lo van a poder tratar los mtodos definidos para l, y estos mtodos estn preparados para trabajar especficamente con l. Este grado de compenetracin evita que un mtodo pueda tratar datos no apropiados, o bien que unos datos puedan ser tratados por un mtodo no adecuado, ya que la llamada a cualquier mtodo ha de ir siempre precedida del objeto sobre el que se quiere actuar, y ste sabe si ese mtodo se ha definido o no para l. C++ es un lenguaje que contiene estos y otros conceptos de POO. En terminologa POO, cuando se quiere ejecutar un mtodo (funcin) sobre un objeto, se utiliza un mensaje que se enva al objeto, de tal forma que el objeto llame al mtodo y ste sepa qu objeto lo ha llamado. 1.2. Encapsulacin Este concepto permite tener un control de acceso selectivo tanto a los miembros como a los mtodos, de tal forma que desde fuera del objeto slo se pueda acceder a los mtodos e identificadores que permita el creador del objeto. 1.3. Herencia Permite la reutilizacin y la extensin del cdigo. Permite disear nuevas clases a partir de otras ya existentes, pudiendose adems extender sus mtodos (cambiar su semntica en la clase que hereda). J Ej. Pilas y Colas.
1
1.4. Polimorfismo
Permite tratar de forma genrica objetos de distintas clases, ahorrando as cdigo y proporcionando simplicidad. Por tanto, trata de forma genrica objetos de distintos tipos derivados de una misma clase de objetos. 1.5. Constructores y Destructores Un constructor es un mtodo que se ejecuta automticamente cuando se define o se crea un objeto, y su funcin es inicializar el objeto y prepararlo para realizar las operaciones necesarias. Un destructor es un mtodo que se ejecuta automticamente cuando un objeto queda fuera del mbito en el que se cre, y su funcin es destruir el objeto, liberando cualquier asignacin dinmica de memoria que se haga. El objeto puede tener o no definidos explcitamente el constructor y el destructor, o tener varios constructores.
Nota: Muy importante no olvidar el punto y coma final. Cuando deseemos crear un objeto de una clase definida lo que haremos ser lo siguiente:
Nombre de la Clase Nombre del Objeto; Punto p1,p2; // Creacin de dos objetos // de la clase Punto 2
Se puede acceder a los datos y mtodos de una clase de la misma forma que se accede a un campo de una estructura, es decir, con . o con ->, seguido del nombre del elemento a usar.
Programacin orientada a objetos con C++ class Celdilla { char Caracter, Atributo; //Miembros privados public: void FijaCeldilla(char C, char A) { Caracter=C; Atributo=A; } void ObtenCeldilla(char &C, char &A) { C=Caracter; A=Atributo; } //&C es una referencia a la variable C }; Figura 1. Ejemplo de la definicin de una clase con mtodos definidos dentro de la clase.
3. SOBRECARGA
Consiste en la redefinicin de un mtodo. Por tanto, un mtodo sobrecargado es un mtodo que consta de varias definiciones distintas, aunque todas ellas llamadas de igual forma. Lo que va a permitir distinguir un mtodo de otro que se llame de igual forma van a ser el tipo y el nmero de parmetros que recibe.
#include <iostream.h> class Celdilla { char Caracter, Atributo; public: void FijaCeldilla(char C, char A) { Caracter=C; Atributo=A; } void FijaCeldilla(unsigned CA) { Caracter=CA & 0xff; Atributo=CA >> 8; } void ObtenCeldilla(char &C, char &A) { C=Caracter; A=Atributo; } unsigned ObtenCeldilla() { return Atributo<<8 | Caracter; } }; void main() { Celdilla X, Y; unsigned Casilla; char C, A; X.FijaCeldilla(A,112); // Fija los valores del objeto X Casilla = X.ObtenCeldilla(); //Obtiene el valor de X en forma // de un entero Y.FijaCeldilla(Casilla); //Toma Y en dos caracteres cout << Caracter= << C << , Atributo= << (int) A; } Figura 3. Ejemplo de sobrecarga de mtodos de una clase. 5
4. CONSTRUCTORES Y DESTRUCTORES
Cada vez que se define una variable de un tipo bsico, el programa ejecuta un procedimiento que se encarga de asignar la memoria necesaria, y si es necesario, tambin realizar las inicializaciones pertinentes. De forma complementaria cuando una variable queda fuera de mbito se llama a un procedimiento que libera el espacio que estaba ocupando dicha variable. El mtodo al que se llama cuando creamos una variable es el constructor, y al que se llama cuando se destruye una variable es el destructor. Una clase puede tener uno o varios constructores, pero un slo destructor. El constructor debe tener el mismo nombre que la clase a la que pertenece, mientras que el destructor tambin debe llamarse de igual forma pero precedido por el carcter . Estos mtodos no van a tener parmetros de salida, ni siquiera puede usarse void. Sin embargo, el constructor s podra tomar parmetros de entrada, cosa que no puede hacer el destructor.
#include <string.h> class Cadena { char *pc; unsigned longitud; public: Cadena( char * Str); Cadena() { delete pc; } Cadena Operator+(Cadena c); int Operator==(Cadena c) { return ! strcmp(pc, c.pc); } unsigned strlen() { return longitud; } }; Cadena::Cadena(char * Str) { longitud= ::strlen( Str); pc=new char[longitud+1]; strcpy(pc, Str); } Cadena Cadena::operator+(Cadena c) { char Resultado[ 1024 ]; strcpy(Resultado, pc); strcat(Resultado, c.pc); Cadena Temp(Resultado); return Temp; } void main() { Cadena C1(Pis Pas), C2(Pas Pis); } Figura 4. Ejemplo de una clase con constructor y destructor. 6
Al haber creado un constructor que toma un parmetro - la cadena a asignar a la cadena que se est declarando-, ya no es posible crear un objeto de clase Cadena sin ese parmetro. Puesto que es posible tener varios constructores, estamos usando sobrecarga. Tambin se puede tener un constructor que por ejemplo inicialice a nulo todos los datos miembros de la clase.
include <string.h> class Cadena { char *pc; unsigned longitud; public: Cadena (){ longitud=0; pc=0;} Cadena (char * Str); Cadena (Cadena &c); Cadena (){ if (longitud) delete pc;} Cadena operator+ (Cadena c); void operator= (Cadena c); int operator==(Cadena c) { return ! strcmp(pc, c.pc); } unsigned strlen() { return longitud; } }; Cadena::Cadena(char * Str) { longitud= ::strlen( Str); pc=new char[longitud+1]; strcpy(pc, Str); } Cadena Cadena::operator+(Cadena c) { char Resultado[ 1024 ]; strcpy(Resultado, pc); strcat(Resultado, c.pc); Cadena Temp(Resultado); return Temp; } Cadena Cadena::operator=(Cadena &c) { longitud=c.longitud; pc=new char[longitud+1]; strcpy(pc,c.pc); } void main() { Cadena C1(Pis Pas), C2(Pas Pis); Cadena C3(C1), C4= C1+C2; C3=C2; } Figura 5. Ejemplo de una clase con constructores de copia y asignacin, y con destructor. 7
Esto no sera correcto hasta que no se cree un constructor que recibiendo un objeto de la clase Fecha cree un objeto de la clase Cadena. En el otro caso, es decir, convertir un dato de nuestra clase en otro tipo, hay que sobrecargar los operadores de moldeado o casts. Por ejemplo, si queremos mostrar por pantalla la cadena de caracteres que tiene un objeto, as como su longitud, no podramos hacer cout<<C1, sino que tendramos que especficar el tipo bsico de datos que queremos mostrar, es decir, debemos hacer lo siguiente: cout<<(char *) C1; cout<<(int) C1;
4.3. Destructores
El destructor, como se mencion antes, se distingue del resto de miembros de una clase porque va precedido por el carcter . Cada vez que un objeto deja de ser til, se llamar al destructor del objeto, que realizar sobre ste las ltimas operaciones que sean necesarias. Si no se provee de un destructor se crear uno por defecto, que destruir el objeto, sin tener en cuenta posibles liberaciones de memoria. Cualquier destructor no puede aceptar parmetros ni de entrada ni de salida, y adems slo puede aparecer a lo sumo uno en cada clase.