0% encontró este documento útil (0 votos)
265 vistas

Programación Orientada A Objetos Con C++ PDF

Este documento explica conceptos básicos de programación orientada a objetos en C++, incluyendo clases, objetos, encapsulamiento, herencia, polimorfismo, constructores y destructores.

Cargado por

thekrash
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
265 vistas

Programación Orientada A Objetos Con C++ PDF

Este documento explica conceptos básicos de programación orientada a objetos en C++, incluyendo clases, objetos, encapsulamiento, herencia, polimorfismo, constructores y destructores.

Cargado por

thekrash
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 31

PROGRAMACIN ORIENTADA A OBJETOS CON C++ o cmo aprender C++ en 1 hora!

sin que se note que realmente est escribiendo en C

Enrique Alba Torres Andrs Rubio del Ro

Programacin orientada a objetos con C++

PROGRAMACIN ORIENTADA A OBJETOS (POO) CON C++


1. TRMINOS Y CONCEPTOS DE POO
El esquema tradicional de un programa, independientemente del lenguaje que se utilice, est compuesto por una secuencia de sentencias, ms o menos agrupadas en rutinas o funciones, que van operando sobre una informacin contenida en campos o variables. El problema de esta estructura estriba en que ni las sentencias tienen un control de las variables con las que trabajan, ni estas variables estn relacionadas en forma alguna con las sentencias que habrn de tratarlas. Cmo puede la POO ayudarnos? 1.1. Qu Significa POO?

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

Programacin orientada a objetos con C++

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.

2. POO CON C++


2.1. Clases
Una clase es una definicin de operaciones que se define una vez en algn punto del programa, pero normalmente se define en un archivo cabecera, asignndole un nombre que se podr utilizar ms tarde para definir objetos de dicha clase. Las clases se crean usando la palabra clave class, y su sintaxis es la siguiente:
class Nombre_de_la_Clase { Definicin_de_Datos; Prototipos_y_mtodos; };

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

Programacin orientada a objetos con C++

Tambin se pueden definir apuntadores a objetos de la siguiente forma:


Nombre de la Clase *Nombre del Objeto; Punto p1,p2; // Creacin de dos objetos // de la clase Punto

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.

2.2. Miembros Pblicos, Protegidos y Privados


Un miembro pblico es accesible en cualquier lugar en el que exista un objeto de la clase. Un miembro protegido slo es accesible desde las clases que se hereden de la clase que lo contiene. Un miembro privado slo es accesible por los mtodos de la clase a la que pertenece. Tambin se puede crear una clase usando la palabra clave struct, la diferencia es que con struct los miembros se hacen pblicos por defecto, mientras que con class se hacen privados por defecto. Para hacer un miembro pblico, privado o protegido usamos respectivamente: public, private o protected

2.3. Definicin de una Clase


El cuerpo de un mtodo, puede o bien incluirse en la definicin de una clase, en cuyo caso lo llamaremos mtodo inline, o bien en un archivo fuera de la clase. Para que C++ sepa cundo una funcin es simplemente una funcin, y cundo es un mtodo, en ste ltimo caso siempre debemos poner al mtodo como prefijo el nombre de la clase a la que pertenece seguido de :: (operador de mbito). J Ej. Ver figuras 1 y 2.
3

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.

Esto mismo se podra haber hecho como se muestra en la figura 2.

2.4. Mtodos Inline


En la definicin de la clase anterior pueden verse dos variantes, en la primera los mtodos se definen dentro de la misma clase, mientras que en la segunda slo se incluye en la clase un prototipo de los mtodos, su implementacin est fuera. Los mtodos cuya definicin se incluye en la clase se denominan Mtodos inline. En el caso de emplear mtodos inline, vamos a tener como beneficio que la ejecucin va a ser ms rpida, pero sin embargo, el cdigo objeto que genera el compilador va a ser mayor. En algunos compiladores puede que no suceda esto, pero normalmente suele ocurrir. As, a la conclucin a la que podemos llegar es que, para mtodos pequeos, el mtodo Inline si es ptimo, pero en caso contrario no lo ser.
class Celdilla { char Caracter, Atributo; public: void FijaCeldilla(char C, char A); void ObtenCeldilla(char &C, char &A); }; void Celdilla::FijaCeldilla(char C, char A) { Caracter=C;Atributo=A; } void Celdilla::ObtenCeldilla(char &C, char &A) { C=Caracter;A=Atributo; } Figura 2. Ejemplo de la definicin de una clase con mtodos no Inline. 4

Programacin orientada a objetos con C++

2.5. Entrada y Salida Bsica


2.5.1. cin y cout
cin y cout son dos flujos (entrada y salida) de datos pertenecientes a la biblioteca de C++ llamada iostream, y se utilizan para lo siguiente: cin>>dato : Almacena el carcter introducido por teclado en dato. cout<<dato : Lee el contenido de dato y lo muestra por pantalla.

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

Programacin orientada a objetos con C++

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

Programacin orientada a objetos con C++

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

Programacin orientada a objetos con C++

4.1. Constructor de Copia y Asignacin


En el ejemplo anterior, se observa que el operador de concatenacin devuelve un objeto de la clase Cadena a fin de que ese valor de retorno se asigne a algn objeto de la forma C3=C1+C2. Sin embargo, no se ha definido el operador = para esta clase, y esto va a funcionar a pesar de ello porque por defecto el operador = hace una copia bit a bit. Por el contrario s va a haber problemas cuando ocurra que el operando de destino (C2=C1) apunte a alguna direccin de memoria y con esta asignacin se pierda. Para evitar este problema, se usa el constructor de copia y asignacin, definiendo el mtodo operator=(). Sin embargo, hay a veces un problema con este operador que nos lleva a que tengamos que sobrecargarlo. Si se ejecuta el programa de la figura 5 paso a paso, se ver que para crear e inicializar los objetos C3 y C4 se usa el constructor de copia, mientras que en la asignacin C3=C2 se llama al mtodo operator=(). Tambin observar que el programa llama a veces al constructor de copia sin causa aparente, esto es porque dicho constructor tambin se utiliza para crear objetos temporales por parte del programa, por ejemplo para pasar un objeto de una funcin a otra.

4.2. Constructor de Conversin


A veces es necesario usar un objeto de una determinada clase en una expresin que no est preparada para l, y habr que realizar conversiones (casting). Pueden ocurrir dos casos: a) Que se asigne a un objeto de nuestra clase otro que no lo es. b) Que se asigne a un objeto de otra clase otro de la nuestra. J Ej.: Tenemos una definicin del siguiente tipo: Cadena C1; C1=Hola, mundo, Esto s es correcto, porque estamos asignando a C1 un char *, que sera la cadena Hola, mundo, que ser lo que reciba como parmetro el constructor de la clase Cadena: Cadena(char *Str); Sin embargo no sera correcto: Cadena C1; Fecha Hoy; C1=Hoy;

Programacin orientada a objetos con C++

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.

4.4. Asignacin Dinmica de Memoria


Se llama Asignacin Dinmica de Memoria al proceso mediante el cual, se va reservando memoria a medida que vaya haciendo falta, y se va liberando cuando ya no sea til. Algunos ejemplos son los vistos antes con new y delete. Un objeto tambin se puede crear explcitamente por medio del operador new, que asignar la memoria necesaria para contener al objeto y devolver un puntero al objeto en cuestin. J Ej.: Cadena *C=new Cadena; El operador new siempre va seguido de un parmetro que indica el tipo de objeto que se quiere crear. De este parmetro, new obtiene el nmero de bytes necesarios para almacenar el objeto, y a continuacin buscar un bloque de memoria apropiado, lo asigna al programa y devuelve su direccin. En este caso, accederemos a los miembros de la clase mediante el operador ->, y por medio de * accedemos al
9

También podría gustarte