Вы находитесь на странице: 1из 8

Programacin Orientada a Objetos

Informtica II Fundamentos de Programacin

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

Concepto de POO
Un Objeto es una encapsulacin de un conjunto de datos y de los mtodos para manipular stos. Las caractersticas fundamentales de la Programacin Orientada a Objetos (POO) son: Abstraccin : Es la representacin de las caractersticas esenciales de algo sin incluir los antecedentes o detalles irrelevantes. La clase es una abstraccin porque en ella se definen las propiedades y los atributos genricos de un conjunto de objetos. Las clases tratan de representar el mundo real. Encapsulacin u ocultamiento de informacin: Las variables y las funciones miembro de una clase pueden ser declaradas como public, private o protected. De esta forma se puede controlar el acceso a los miembros de la clase y evitar un uso inadecuado. Herencia: Es el mecanismo para compartir automticamente mtodos mtodos y atributos entre clases y subclases. Una clase puede derivar de otra, y en este caso hereda todas las variables y funciones miembro. As, puede aadir nuevas funciones y datos miembros. Polimorfismo: Esta caracterstica permite implementar mltiples formas de un mismo mtodo, dependiendo cada una de ellas de la clase sobre la que se realice la implementacin.

Un ejemplo de la POO es Windows, donde cada ventana, botn, men, etc. es un objeto. Cada uno tiene sus propias caractersticas (datos) y sus propios mtodos (funciones) para manipularlos.
Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun 2

Concepto de clase en C++


Una Clase es un tipo de datos definido por el usuario. Bsicamente, es una agrupacin de datos (variables) y de funciones (mtodos) que operan sobre esos datos. La definicin de una clase consta de dos partes:
La primera est formada por el nombre de la clase precedido por la palabra reservada class. La segunda parte es el cuerpo de la clase, encerrado entre llaves y seguido por (;):
class nombre_clase { //cuerpo de la clase };

El cuerpo de la clase consta de:


Especificadores de acceso: public, protected y private. Atributos: datos miembro de la clase (variables). Mtodos: definiciones de funciones miembro de la clase. Por omisin, los datos miembro de la clase son private. Tanto las variables como los mtodos pueden ser declarados public, protected y private, controlando de esta forma el acceso y evitando un uso inadecuado ->Encapsulacin. Por lo general, las definiciones de las clases se hacen en ficheros de cabecera (*.h), los cuales suelen llevar el nombre de la clase, en el caso de que slo haya una en l.
Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun 3

Miembros de una clase


Los miembros de una clase pueden ser variables de cualquier tipo y funciones. En C++ a las variables se las denomina datos miembro y a las funciones, funciones miembro de la clase. Datos miembro de una clase:
Para declarar un dato miembro se procede de la misma forma que para declarar cualquier variable. Por ejemplo:
class Complejo { public: float real; float imaginario = 0; };

//especificador de acceso //Declaracin correcta //MAL, no se puede inicializar

Los datos miembro no pueden ser inicializados durante la declaracin. Si no se pone un especificador de acceso (como es nuestro ejemplo public), por defecto los datos miembro sern private. En una clase cada dato miembro debe tener un nombre nico. Tambin podemos declarar como datos miembro de una clase, objetos de otra clase, siendo necesario que sta haya sido previamente definida.
class Datos { Complejo c1; };

//Declaracin de un objeto de la clase Complejo

Para Acceder a un dato miembro (siempre y cuando sea declarado como pblico) de una clase desde un objeto, se utilizar el operador Punto (.). Por ejemplo: c1.real = 5.4; Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun 4

Miembros de una clase (cont.)


Funciones miembro de una clase:
Las funciones miembro de una clase definen las operaciones que se pueden realizar con sus datos miembro. Las funciones miembro tambin pueden ser pblicas o privadas, lo cual se hace con los respectivos especificadores. Al igual que los datos miembro, si no se especifica sern privadas (private) por defecto. Para declarar una funcin miembro de una clase se procede de la misma forma que para declarar una funcin cualquiera. Por ejemplo en el fichero complejo.h:
class Complejo { private: float real,imaginario; public: //funcione miembro pblicas void Asignar (float x, float y); };

El cuerpo de una clase slo contiene los prototipos de las funciones miembro (las declaraciones). La definicin de la funcin se hace en los ficheros fuente (*.cpp). Para definir la funcin miembro en el fichero fuente se utiliza el nombre de la clase seguido por el operador de resolucin de mbito (::). Por ejemplo, en el fichero complejo.cpp:
void Complejo::Asignar(float x, float y) { real = x; imaginario = y; //acceso a los datos miembro //... Ms cdigo }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

Miembros de una clase (cont.)


Las funciones miembro que tengan poco cdigo, o las que se desee, tambin pueden ser definidas en el cuerpo de la clase. Por ejemplo:
En complejo.h:
class Complejo { private: float real,imaginario; public: void Asignar(float x, float y); void Print(void){ cout << real << " + " << imaginario << "i" << endl; } };

En complejo.cpp:
void Complejo::Asignar(float x, float y) { real = x; imaginario = y; }

En nuestro ejemplo, la funcin Print() ha sido definida en el cuerpo de la clase, con lo cual ya no hay necesidad de hacerlo en el fichero fuente. Dentro del cuerpo de la clase no hay necesidad de anteponer el nombre de la clase con el operador (::), como se hace generalmente en el fichero fuente, puesto que el nombre de la clase es conocido. Para Acceder a una funcin miembro (siempre y cuando sea declarada como pblica) de una clase desde un objeto, se utilizar el operador Punto (.). Por ejemplo: c1.Asignar( 5.4, 1.2); Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun 6

Miembros de una clase (cont.)


Control de acceso a los miembros de la clase:
El concepto de clase incluye la idea de ocultacin de datos, que, bsicamente, consiste en que no se puedan acceder a los datos miembro directamente, sino que hay que hacerlo a travs de las funciones miembro pblicas de la clase. Para controlar el acceso a los miembros (datos y funciones) de una clase, C++ provee de 3 especificadores:
public: un miembro declarado pblico es accesible en cualquier parte del programa donde el objeto de la clase en cuestin es accesible. private: un miembro declarado privado puede ser accedido solamente por las funciones miembro de su propia clase o por funciones amigas (friend) de su clase. En cambio no puede ser accedido por funciones globales o por las funciones propias de una clase derivada (herencia). protected:un miembro declarado protegido se comporta exactamente igual que uno privado para las funciones globales, pero acta como un miembro pblico para las funciones miembro de una clase derivada.
//fichero complejo.h class Complejo { protected: float real,imaginario; public: void Asignar(float x, float y); } void Print(void){ cout <<real<<" + "<<imaginario<<"i"<< endl; } };

#include complejo.h void main() { Complejo c1; //creacin de un objeto c1.real = 4.5; //error, real es protected c1.Asignar(4.5,5.5); //Correcto c1.Print(); //Bien, Print en public //fichero complejo.cpp #include complejo.h void Complejo::Asignar(float x,float y) { real = x; imaginario = y; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

Objetos de una clase


Un Objeto es un ejemplar concreto de una clase. Las clases son como tipos de variables, mientras que los objetos son como variables concretas de un tipo determinado. Los objetos constan de una estructura interna (los datos) y de una interfaz que permite manipular tal estructura (las funciones). Cmo se construye un objeto de una clase? Igual que cualquier otro objeto o variable de un tipo predefinido, es decir, anteponiendo el nombre de la clase al nombre del objeto:
Complejo miComplejo;

Un objeto no se inicializa como las variables:


Complejo miComplejo=5; //Error

Hay que recordar que un objeto tiene una copia de todos los datos miembro de una clase, entonces cmo puedo inicializar esos datos miembro al momento de la creacin del objeto? Para solucionar este problema, C++ permite inicializar el objeto de una determinada clase en el momento de su declaracin mediante un constructor definido por el usuario. Tambin existe otra forma de inicializar un objeto al momento de su declaracin: Complejo c1={1.5,-3.5}; Esta forma es muy restrictiva y poco utilizada ya que exige que las variables miembro de la clase sean declaradas como pblicas, que la clase no tenga constructores y que no sea derivada. Tambin se puede inicializar un objeto utilizando el operador de asignacin (=), utilizando para ello otro objeto que ya haya sido inicializado. Ejemplo: comp1 = comp2;
Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun 8

Constructor
En C++, una forma de asegurar que los objetos siempre contengan valores vlidos y que puedan ser inicializados al momento de la declaracin es escribiendo un constructor. Un constructor es una funcin miembro especial de una clase que es llamada de forma automtica siempre que se declara un objeto de esa clase. Su funcin es crear e inicializar un objeto de su clase. Dado que un constructor es una funcin miembro, admite argumentos al igual que stas. El constructor se puede distinguir claramente, con respecto a las dems funciones miembro de la clase, porque tiene el mismo nombre que el de la clase. Un constructor no retorna ningn valor ni se hereda. Si el usuario no ha creado uno, el compilador crea uno por omisin, sin argumentos. Pueden existir varios constructores, siempre y cuando difieran en los argumentos. Se puede crear un objeto de cualquiera de las formas siguientes:
Declarando un objeto local o temporal: Invocando al operador new: Complejo c1; Complejo *c1 = new Complejo; Complejo *c1 = new Complejo(3,4); De esta forma, se debe llamar al operador delete al finalizar; Llamando explcitamente al constructor: Complejo c1(4.5 , 5.0);

Cuando se utiliza el operador new para crear el objeto, el acceso a las variables y funciones miembro de la clase se hace a travs del operador (->), siempre y cuando sean pblicas. Por ejemplo:
c1->real = 4.5; c1->Print();

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

Constructor (cont..)
Ejemplo:
#include <iostream.h> #include "complejo.h" void main() { Complejo c1; //creacin de un objeto c1.Asignar(4.5,5.5); //Correcto c1.Print(); //objeto c2 Complejo c2; c2.Print(); //usa el const. defecto //fichero complejo.h #include "iostream.h" class Complejo { protected: float real,imaginario; public: void Asignar(float x, float y); void Print(void){ cout <<real<<" + "<<imaginario<<"i\n"; } public: Complejo(){ //constructor 1 real=imaginario=0.0; } Complejo(float x, float y); //constr. 2 }; // fichero complejo.cpp #include "complejo.h" Complejo::Complejo(float x, float y) { real = x; imaginario = y; } void Complejo::Asignar(float x, float y) { real = x; imaginario = y; }

//objeto c3 Complejo c3(1.5,-1.5); //usa el const. 2 c3.Print(); //objeto 4 //Complejo *c4 = new Complejo; Complejo *c4 = new Complejo(2,5); c4->Print(); delete c4; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

10

Destructor
De la misma forma que existe una funcin para construir cada unos de los objetos que declaramos, tambin existe una funcin para destruir cada objeto construido, liberando as la memoria que ocupa. Esta funcin recibe el nombre de destructor. Un objeto es destruido automticamente al salir del mbito en el que ha sido definido. Sin embargo, si se ha creado con el operador new, se debe utilizar el operador delete para destruirlo. El destructor es una funcin miembro especial de una clase que se utiliza para eliminar un objeto de esa clase. El destructor se distingue fcilmente del resto de funciones porque tiene el mismo nombre que la clase precedido del operador tilde ~. El destructor no es heredado, no tiene argumentos ni puede retornar ningn valor. No hace falta llamar al destructor, ya que ste es invocado de forma automtica cuando se destruye el objeto por los medios mencionados anteriormente. Si hiciera falta, el destructor tambin puede ser invocado de forma explcita:
Objeto.nombre_clase::~nombre_clase; Objeto->nombre_clase::~nombre_clase;
class Complejo //complejo.h { public: float real,imaginario; public: Complejo(); //constructor ~Complejo(); //destructor };

//llamada al destructor //cuando el objeto ha sido creado con new


Complejo::Complejo() //complejo.cpp { //codigo necesario para inicial. real = imaginario = 0; } Complejo::~Complejo() { //codigo necesario para liberar mem. cout << "Se ha llamado al destruc\n"; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun


#include <iostream.h> #include "complejo.h" void main() { Complejo c1(4.5,-1.5); Complejo c2; c2.Asignar(1.5,1.0); Complejo Sum; Sum = c1.Suma(c2); c1.Print(); cout<<" + "; c2.Print(); cout << " = "; Sum.Print(); cout << endl; //Resta Complejo Resta; Resta.Resta(c1,c2); c1.Print(); cout<<" - "; c2.Print(); cout << " = "; Resta.Print(); cout << endl; } //fichero complejo.h #include "iostream.h" class Complejo { protected: float real,imag; public: //constructores Complejo() { real = imag = 0.0;} Complejo(float x, float y); ~Complejo(); //destructor public: void Asignar(float x, float y); void Print(void){ cout <<"["<<real<<","<<imag<<"i]"; } Complejo Suma(Complejo c); void Resta(Complejo,Complejo); };

11

Ejemplo Completo
// fichero complejo.cpp #include "complejo.h" void Complejo::Asignar(float x, float y) { real = x; imag = y; } Complejo::Complejo(float x, float y) { real = x; imag = y; } Complejo::~Complejo() { cout << "Se ha llamado al destructor\n"; } Complejo Complejo::Suma(Complejo c) { Complejo tmp; //se crean 3 Compl. temp. tmp.real = this->real + c.real; tmp.imag = this->imag + c.imag; return tmp; } void Complejo::Resta(Complejo c1,Complejo c2) { this->real = c1.real - c2.real; this->imag = c1.imag - c2.imag; }

El puntero implcito this: C++ proporciona este puntero para que una funcin miembro conozca la identidad del objeto particular que la est llamando, de esa forma acceder a los datos de dicho objeto, ya que todos los objetos comparten las funciones miembro mas no los datos, lo cuales cada uno tiene su propia copia. 12

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

Miembros static de una clase


Cada objeto tiene una copia de los datos miembro de la clase. Qu pasa cuando necesito que todos los objetos tengan un dato miembro en comn? Un dato miembro de una clase declarado como static implica que slo existir una copia de ese dato miembro para todos los objetos y existe aunque no existan objetos de esa clase, con lo cual se concluye que es un dato asociado con la clase y no con el objeto. Un dato miembro static:
Puede ser declarado static, private o public. Tiene que ser inicializado a nivel global (mbito de fichero, no de clase). Cuando sea accedido a travs de una funcin miembro, dicha funcin tambin tiene que ser declarada static. Y por ltimo, existe aunque no haya ningn objeto de la clase declarado.

#include <iostream.h> #include <iostream.h> class CPersona { int CPersona::num = 0; //inicializac. global private: static int num; void main() char *nombre; { int edad; CPersona p1("Carla",5); public: cout<<"Num.Objetos:"<<CPersona::Num()<<endl; CPersona(char *name="No Dato",int ed=0){ CPersona p2("Juan",31); nombre = name; edad = ed; cout<<"Num.Objetos:"<<CPersona::Num()<<endl; num++; CPersona *p3 = new CPersona("Ana",25); } cout<<"Num.Objetos:"<<CPersona::Num()<<endl; ~CPersona(){ num--; } delete p3; //eliminar 1 objeto static int Num(){ return num;} cout<<"Num.Objetos:"<<p1.Num()<<endl; char *GetName(){ return nombre; } cout<<"Nombre:"<<p1.GetName()<<endl; }; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

13

Arrays de objetos
Al igual que con los tipos estndar, tambin es posible crear arrays de objetos:
Forma esttica, utilizando los corchetes: Nombre_clase Nombre_array[num_objetos]; Forma dinmica, usando new: Nombre_clase *Nom_Puntero = new Nombre_clase[num]; Recordar de llamar a delete cuando ya no necesitemos el array.

Para crear un puntero a objeto se utiliza new. Para acceder a los miembros se usa el operador (->).
#include <iostream.h> #include <string.h> //para strlen class CAlumno { private: char *nombre; int edad; long telefono; public: CAlumno(){;} //const. por defecto CAlumno(char *buf, int ed, int tel); ~CAlumno(); void Print(); void Asignar(char *buf,int ed,int tel); }; CAlumno::CAlumno(char *buf,int ed,int tel) { nombre = new char[strlen(buf)+1]; strcpy(nombre,buf); edad = ed; telefono = tel; } CAlumno::~CAlumno() { if (nombre!=NULL) delete nombre; } void CAlumno::Asignar(char *buf,int ed,int tel){ nombre = new char[strlen(buf)+1]; strcpy(nombre,buf); edad = ed; telefono = tel; } void CAlumno::Print(){ cout << "\nNombre: " << nombre; cout << "\nEdad: " << edad; cout << "\nTelefono: " << telefono; } void main(){ CAlumno al[3]; //array de 3 objetos al[0].Asignar("Juan",22,943215677); al[1].Asignar("Pedro",20,943215673); al[2].Asignar("Ana",21,943215271); for (int i=0;i<3;i++) al[i].Print(); int num=2; // dinamicamente CAlumno *alumnos = new CAlumno[num]; alumnos[0].Asignar("Carla",5,943567221); alumnos[1].Asignar("Mikel",15,943567222); for (i=0;i<num;i++) alumnos[i].Print(); delete [] alumnos; CAlumno *pAlum = new CAlumno("Joseba",21,943765432); pAlum->Print(); delete pAlum; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

14

Funciones amigas
Los miembros de una clase declarados como privados solamente pueden ser accedidos mediante las funciones miembro de la clase, garantizando as la integridad de los datos. Una funcin declarada friend (amiga) de una clase puede acceder a los miembros privados y protegidos de la clase C++. Para declarar una funcin amiga, basta con escribir la palabra clave friend delante del nombre de la funcin. En la definicin de sta no hace falta anteponer el nombre de la clase. Vase el siguiente ejemplo:

class Complejo { private: float real; float imag;

public: Complejo(){;} Complejo(float x, float y){ real=x; imag=y; } void Print(); friend void LeerDatos(double &r, double &i, Complejo c); };

void LeerDatos(double &r, double &i, Complejo c) { r=c.real; i=c.imag; } void Complejo::Print() { cout << "Real: " << real ; cout << " Imag: " << imag <<endl; } void main() { Complejo c1(1.5,4.5); double r,i; LeerDatos(r,i,c1); //accede a datos de c1 cout << "R:"<<r<<" Imag:"<<i; }

Escuela Superior de Ingenieros de San Sebastin - Tecnun Tecnun

15

Вам также может понравиться