Sunteți pe pagina 1din 9

Programacin I

UNIDAD 4 CLASES Y OBJETOS

1. 2. 3. 4. 5. 6. 7. 8.

DEFINICIN DE UNA CLASE DECLARACIN DE CLASES MIEMBROS DE UNA CLASE AMBITO REFERENTE A UNA CLASE ESPECIFICADORES DE ACCESO CREACIN DE OBJETOS PUNTERO THIS CONSTRUCTORES Y DESTRUCTORES. ( MOVIMIENTO DE CLASES)

Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I DEFINICION DE CLASE Es un modelo que se utiliza para describir uno o ms objetos del mismo tipo. La comunicacin con un objeto se realiza a travs del paso de mensajes. El envo de un mensaje a una instancia de una clase produce la ejecucin de un mtodo (funcin miembro en C++).

DECLARACIN DE UNA CLASE class contador{ long cuenta; public: void leervalor(long); long obtenervalor( ); };

Implementacin de una clase Void contador::leerValor(long valor) { cuenta = valor, } long Contador::obtenerValor( ) { return cuenta;} } Componentes de una definicin de una clase

CLASE Una clase es un tipo de dato que contiene uno o ms elementos dato llamados miembro dato, y cero, una o ms funciones que manipulan esos datos (llamados miembro funcin o funciones miembros). Una clase se puede definir con una estructura (estruct), una unin (unin) o una clase class. La sintaxis de una clase es: class nombre_clase { miembro_1; //lista miembro miembro_2; miembro_3; funcion_miembro_1( ); // funciones miembro conocidas funcion_miembro_2( ); //funciones como mtodos }; Los objetos o instancias de una clase se definen as: Nombre_class_instancia_1; Un puntero o referencia a un objeto proporciona medios indirectos para acceder a u n objeto, sin embargo, el puntero o la propia referencia no es una instancia de una clase.

Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I Y una clase es sintacticamente igual a una estructura, con la nica diferencia de que en el tipo class todos los miembros son por defecto privados mientras que en el tipo struct son por defecto pblicas. As la estructura fecha antes declarada, se puede declarar con class: class fecha{ int da; int mes; int anyo; MIEMBROS PBLICOS Y PRIVADOS. o Miembros pblicos. public: Son accesibles para el usuario de la clase. o Miembros privados. private: No son visibles para el usuario de la clase. class nombre { private: ... // Miembros privados public: ... // Miembros pblicos }; o Pueden aparecer varias veces (y en distinto orden) las clusulas public: y private: o Por defecto, si no se indica nada, los miembros son private. ?? Declaracin de los miembros de una clase: Igual que la definicin de variables y funciones. o No se permite inicializacin de los datos miembros. o En las funciones miembro, el objeto receptor es un parmetro implcito, no hace falta indicarlo. Ejemplo ? class conjuntoInt { private: int tamano; int datos[MAXIMO]; public: void vaciar (); void insertar (int n); void suprimir (int n); bool miembro (int n); }; class vacia {}; class listaFloat { private: listaFloat * siguiente; listaFloat * anterior; public: float actual; int longitud (); void insertar (float valor); listaFloat * avanzar (); listaFloat * retroceder (); };

Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I MBITO DE UNA CLASE Una clase acta como cualquier otro tipo de dato con respecto al mbito. Todos los miembros de una clase se dice que estn en el mbito de esa clase; cualquier miembro de una clase puede referenciar a cualquier otro miembro de la misma clase. Las funciones miembro de una clase tienen acceso no restringido a los miembros dato de esa clase. El acceso a los miembros dato y funciones de una clase fuera del mbito de la clase est controlado por el programador. La idea es encapsular la estructura de datos y funcionalidad de una clase, de modo que el acceso a la estructura de datos de la clase desde fuera de la funcin miembro de la clase, sea limitada o innecesaria. El nombre de la clase tiene que ser nico dentro de su mbito.

ESPECIFICADORES DE ACCESO Restricciones de acceso en C++ En C++ se puede especificar el acceso a los miembros de una clase utilizando los siguientes especificadores de acceso: public: Interfaz de la clase. private : Implementacin de la clase. protected: Implementacin de la familia. Estos especificadores no modifican ni la forma de acceso ni el comportamiento, nicamente controlan desde dnde se pueden usar los miembros de la clase: public: desde cualquier sitio. private : desde los mtodos de la clase. protected: desde los mtodos de la clase y desde los mtodos de las clases derivadas. En ObjGraf.h: //*************************************************/ // Definicion de la clase base TObjGraf //*************************************************/ class TObjGraf { private: int X; int Y; protected: // Pueden acceder los objetos de esta clase y sus descendientes. TColor Color; TPaintBox * PaintBox; public: // Pueden usarlas todas. // Puede acceder SOLO los objetos de esta clase.

// Constructor de objetos TObjGraf TObjGraf (TPaintBox *_PaintBox, TColor _Color= clBlack, int _X=0, int _Y=0);

Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I // Otros metodos virtual void Mostrar (void) = 0; // Mtodo virtual puro }; Modificar de la misma manera las clases TCirculo y TCuadrado para que sus propiedades Radio y Lado queden protegidas y los mtodos pblicos: //*************************************************/ // Definicion de la clase derivada TCirculo. // Deriva de la clase base TObjGraf //*************************************************/ class TCirculo : public TObjGraf { protected: // Pueden acceder los objetos de esta clase y sus descendientes.

int Radio; public: // Metodo constructor TCirculo (TPaintBox *_PaintBox, TColor _Color= clBlack, int _X=0, int _Y=0, int _Radio=1); void Mostrar (void); // Instanciacion del metodo virtual puro // de la clase TObjGraf }; //*************************************************/ // Definicion de la clase derivada TCuadrado. // Deriva de la clase base TObjGraf //*************************************************/ class TCuadrado : public TObjGraf { protected: // Pueden acceder los objetos de esta clase y sus descendientes. int Lado; public: // Metodo constructor TCuadrado (TPaintBox * _PaintBox, TColor _Color= clBlack, int _X=0, int _Y=0, int _Lado=1);

void Mostrar (void); // Instanciacion del metodo virtual puro // de la clase TObjGraf }; As, si en Ppal.cpp escribiramos: //-------------------------------------------------void __fastcall TPpalFrm::FormCreate (TObject *Sender) { Cir1->Mostrar(); // Se puede. Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I Cir1->X = 10; } //-------------------------------------------------En realidad estos tres especificadores de acceso son los propios de C++, pero en C++ Builder existe otro adicional, que es el __published. No vamos a dar mucha importancia a este modificador, porque su uso est restringido al IDE . Cuando en una clase veamos una seccin __published quiere decir que los miembros contenidos en la misma son mantenidos automticamente por el IDE y no deberemos modificar nada en dicha seccin, ya que de lo contrario los resultados pueden ser imprevisibles. Es una buena tcnica de programacin no permitir el acceso pblico a las propiedades de un objeto, ya que si esto ocurriera podra peligrar la integridad del objeto. Entonces cmo se puede cambiar el estado de un objeto desde el exterior? 1. Ofreciendo mtodos (pblicos) que se encarguen de modificar las propiedades (privadas) que se desee. De esta manera son los mtodos los que acceden a las propiedades y el usuario de la clase slo accede a travs de ellos. Esta es la tcnica clsica que se emplea en C++ // No se puede porque X es private.

A travs de los mtodos y de las propiedades "virtuales". Esta tcnica es exclusiva de C++ Builder

CREACION DE OBJETOS 1. Creacin Dinmica Es la forma habitual de crear objetos en C++ Builder, y se realiza mediante el operador new . Cuando usamos new para instanciar un objeto, se usa una variable que referencie o apunte al nuevo objeto creado (de otra manera ste quedara totalmente inaccesible). En definitiva, se requiere la declaracin previa de un puntero a objetos del tipo del que se va a crear. En Ppal.cpp: TObjGraf * ObjGraf; // Variable Global. // ObjGraf es un puntero a objetos de tipo TObjGraf //-------------------------------------------------void __fastcall TPpalFrm::FormCreate (TObject *Sender) { ObjGraf = new TObjGraf; } //-------------------------------------------------La forma de establecer el estado inicial o destruir las componentes de un objeto se estudiarn en el apartado dedicado a Constructores y Destructores Cuidado! Cuando se utiliza esta forma de instanciacin de clases es responsabilidad nicamente del programador la correcta destruccin de los mismos.

Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I 2. Destruccin de objetos Cuando un objeto deja de ser til hay que eliminarlo. De esta manera la aplicacin recupera los recursos (memoria) que ese objeto haba acaparado cuando se cre. La destruccin de objetos creados en tiempo de ejecucin con new se realiza mediante el operador delete. En Ppal.cpp: Pulsando dos veces en OnDestroy de la pestaa Events del editor de objetos de PpalFrm: //-------------------------------------------------void __fastcall TPpalFrm::FormDestroy (TObject *Sender) { delete ObjGraf; } //--------------------------------------------------

EL PUNTERO THIS Nunca se puede llamar a una funcin miembro privada de una clase a menos que se asocie con un objeto. En C cada vez que se utiliza un puntero para acceder a los miembros de una estructura, debe utilizarse el operador de puntero (->) para acceder a los datos. Cmo sabe una funcin miembro cul es la instancia de una clase asociada con ella? El mtodo utilizado por C++ es aadir un argumento extra oculto a las funciones miembro. Este argumento es un puntero al objeto de la clase que lo enlaza con la funcin asociada y recibe un nombre especial denominado this. Dentro de una funcin miembro, this apunta al objeto asociado con la invocacin de la funcin miembro. El tipo de this en una funcin miembro de una clase T es T *const es decir, un puntero constante a un objeto de tipo T. Normalmente, el programador no necesita preocuparse por este puntero, ya que C++ realiza la operacin automticamente, haciendo el uso de this transparente a las funciones miembro que la utilizan. Dentro de una funcin miembro, se pueden hacer referencias a los miembros del objeto asociado a ella con el prefijo this y el operador de acceso ->. Sin embargo, este proceso no es necesario, ya que es redundante. Consideremos como ejemplo el constructor de una clase que manipula nmeros complejos: complejo::complejo (float a,float b) { real=a; imag=b; } Este constructor se puede escribir: complejo::complejo (float a,float b) { Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I this->real=a; this->imag=b; } this->nombre_miembro : apunta a un miembro *this : es el objeto total. Es un valor constante this : es la direccin del objeto apuntado

CONSTRUCTORES Y DESTRUCTORES Constructores y destructores ?? Constructor: es una operacin de inicializacin de un objeto. ?? Por defecto, si no se definen constructores, los datos miembros de un objeto no se inicializan. ?? El constructor de una clase es un mtodo de esa clase, con el mismo nombre que la clase. class conjuntoInt { ... public: conjuntoInt () {tamano= 0;} // Constructor del tipo ... }; o El constructor no devuelve ningn valor. o Se puede aplicar sobrecarga : pueden haber distintos constructores, siempre que los parmetros de entrada sean distintos. class conjuntoInt { ... public: conjuntoInt () {tamano= 0;} // Constructor de conjunto vacio conjuntoInt (int e1) // Constructor de cjt. con 1 elem. {datos[0]= e1; tamano= 1;} conjuntoInt (int e1, int e2) // Constructor de cjt. con 2 elem. {datos[0]= e1; datos[1]= e2; tamano= 2;} ... }; ?? Constructor por defecto: si existe algn constructor sin parmetros (o con todos los parmetros por defecto) se toma como constructor por defecto.

?? Uso de constructores. conjuntoInt cjt; // Se inicializa con el constructor por defecto conjuntoInt cjt(9); // Constructor que incluye 1 elemento conjuntoInt cjt(23,12); // Constructor que incluye 2 elementos ... ?? Destructor: operacin de eliminacin de un objeto. o El nombre del destructor es '~NombreClase'. o No devuelve ningn valor, ni recibe ningn parmetro. o Es necesario definir un destructor si el objeto ha reservado memoria dinmica o ha abierto algn fichero. Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I class conjuntoInt { ... public: ~ conjuntoInt () {cout<<"Nada";} // Destructor, irrelevante aqu ... };

Constructores y Destructores (Inicializacin de Clases I) Son mtodos que permiten establecer el estado inicial y final de un objeto. Los constructores se pueden definir con un conjunto de argumentos arbitrario, pero no pueden devolver nada. Y los destructores no pueden recibir ni devolver ningn valor. El constructor debe llamarse igual que la clase, y el destructor el nombre de la clase precedido del carcter ~ Un constructor se ejecuta cuando se crea un nuevo objeto: 1) por declaracin, 2) cuando se crea dinmicamente con el operador new. Un destructor se ejecuta cuando el objeto deja de existir: 1) porque su mbito acaba, 2) cuando se libera explcitamente con el operador delete. En ObjGraf.h: class TObjGraf { ... // Constructor de objetos TObjGraf TObjGraf (TPaintBox *_PaintBox, TColor _Color= clBlack, int _X=0, int _Y=0); // El destructor sera: ~ TObjGraf (void ); }; En ObjGraf.cpp: TObjGraf :: TObjGraf (TPaintBox * _PaintBox, TColor _Color, int _X, int _Y) { PaintBox = _PaintBox; Color = _Color; X = _X; Y = _Y; } En Ppal.cpp: void __fastcall TPpalFrm::FormCreate (TObject *Sender) { ObjGraf = new TObjGraf (PaintBox, clRed, 10, 10); } Importante: No es necesario escribir un destructor salvo si el objeto requiere memoria dinmica adicional. De ser as, la tarea del destructor ser, bsicamente, liberar la memoria dinmica que ocupa el objeto que se va a destruir.

Apuntes del: Ing. Jorge Eloy Toledo Coronel

S-ar putea să vă placă și