Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Funciones miembro
Constructor de un objeto Destructor de un objeto Sobrecarga de operadores Paso de parmetros por referencia Sobrecarga de constructor de copia Mejora del ejemplo
Clases y objetos - 2
Conceptos iniciales
delete
Libera memoria main () { int *pi; pi = new int; double *pd=new double; delete pd; delete pi; int *pi=new int[10]; delete [] pi; }
Clases y objetos - 6
Qu est mal?
Clases y objetos - 7
Clases y objetos - 8
Clases y objetos
Ejemplo CComplejo I
#ifndef CCOMPLEJO_H #define CCOMPLEJO_H
CComplejo.h
class CComplejo { private: double m_d_real; /** parte real*/ double m_d_imag; /** parte imaginaria*/ public: // constructores y destructor CComplejo(); CComplejo(double r, double i); ~CComplejo(); // funciones de acceso a miembros double getReal(); double getImag(); };
#endif
Clases y objetos - 10
Ejemplo CComplejo II
#include "CComplejo.h" #include <iostream> using namespace std; // ---------- constructores CComplejo::CComplejo(){ m_d_imag = 0; m_d_real = 0; cout << "Me han creado por defecto" << endl; } CComplejo::CComplejo(double r, double i){ m_d_imag = i; m_d_real = r; cout << "Me han creado con r = " << m_d_real << " e i = " << m_d_imag << endl; }
Clases y objetos - 11
CComplejo.cpp
CComplejo::~CComplejo(){ cout << "Me han eliminado (" << m_d_real << "," << m_d_imag << ")" << endl; } // ---------- funciones de acceso a miembros double CComplejo::getReal(){ return m_d_real; } CComplejo.cpp double CComplejo::getImag(){ return m_d_imag; }
Clases y objetos - 12
Ejemplo CComplejo IV
#include "CComplejo.h" main.cpp
void pruComplejos(){ CComplejo C1,C2; cout << "Dentro de pruComplejos" << endl; Me han creado por defecto } Antes de llamar a pruComplejos Me han creado por defecto void main(void) Me han creado por defecto { Dentro de pruComplejos CComplejo C1; Me han eliminado cout << "Antes de llamar a pruComplejos" << (0,0) endl; Me han eliminado (0,0) pruComplejos(); Fuera pruComplejos cout << "Fuera de pruComplejos" << de endl; Me han creado con r = 0 e i = 3 CComplejo C2(0,3); Antes del final cout << "Antes del final" << endl; Me han eliminado (0,3) } Me han eliminado (0,0)
Clases y objetos - 13
Clases y objetos - 14
Clases y objetos - 15
Definicin de una clase I Una clase es un tipo de datos que tiene cuatro atributos asociados:
Variables miembro Funciones miembro Niveles de acceso tanto a las variables miembro como a las funciones miembro. private: no se puede acceder desde fuera de la clase. Oculta la informacin. public: se puede acceder desde fuera protected: slo las clases hijas de esta clase pueden acceder a la informacin (se ver ms adelante). Un nombre como etiqueta que sirve para identificar al nuevo tipo definido por la clase
Clases y objetos - 16
Clases y objetos - 19
Cada vez que se crea un objeto de una clase, se crea espacio de forma automtica para las variables miembro y a continuacin se llama al constructor para que termine de inicializarlas Siempre hay dos constructores por defecto:
Sin parmetros: no hace nada. Desde otro objeto: inicializa las variables miembros con el valor que tienen en el otro objeto.
Se pueden definir constructores adicionales con parmetros, que a su vez tengan valores por defecto.
Clases y objetos - 21
Destructor de un objeto Es una funcin miembro de la clase cuyo nombre es el nombre de la clase acompaado ~.
No se puede llamar directamente
Cuando un objeto va a ser eliminado de un programa, antes de liberar la memoria asignada a sus variables miembro, se llama al destructor. Hay un destructor por defecto que no hace nada. El destructor se puede sobrecargar:
Esto es muy til en el caso de variables que utilicen memoria dinmica para poderla liberar.
Clases y objetos - 22
El operador de asignacin = (I) Al igual que en los tipos bsicos (int, double, etc) las clases tienen automticamente asociadas un operador de asignacin (=) entre objetos de una misma clase. Por defecto, al asignar un objeto a otro de la misma clase hay una asignacin o copia miembro a miembro. Se puede redefinir esta asignacin (sobrecarga del operador =)
Clases y objetos - 23
Me Me C2 Me Me
han creado con r = 0 e i = 1 han creado por defecto = (0,1) han eliminado (0,1) han eliminado (0,1)
Clases y objetos - 24
Clases y objetos - 25
Clases y objetos - 26
Sobrecarga de operador = (II) Es importante si la clase tiene miembros que son memoria dinmica
void CComplejo::operator=(CComplejo c){ m_d_real=c.m_d_real; m_d_imag=c.m_d_imag; cout << "Operador igualdad" << endl; }
Clases y objetos - 27
Me han creado con r = 0 e i = 1 Me han creado por defecto Operador igualdad Me han eliminado (0,1) C2 = (0,1) Me han eliminado (0,1) Me han eliminado (0,1)
Clases y objetos - 28
Clases y objetos - 29
Clases y objetos - 31
CComplejo::CComplejo(const CComplejo& c){ m_d_real=c.m_d_real; m_d_imag=c.m_d_imag; cout << "Me han creado por copia de (" << c.m_d_real << "," << c.m_d_imag << ")" << endl; }
Clases y objetos - 32
creado con r = 0 e i = 1 creado por copia de (0,1) de copia (0,1) eliminado (0,1) eliminado (0,1)
Clases y objetos - 33
void main(void) { CComplejo C1(0,1); cout << "C1: " << C1 << endl; } Me han creado con r = 0 e i = 1 C1: (0,1) Me han eliminado (0,1)
Clases y objetos - 35
Mejora de la clase CComplejo (I) Que pasa si en vez de querer sacar por pantalla el complejo en formato (r,i) se quiere en [r,i]?
CComplejo::CComplejo(const CComplejo& c){ m_d_real=c.m_d_real; m_d_imag=c.m_d_imag; cout << "Me han creado por copia de " << c << endl; } CComplejo::CComplejo(double r, double i){ m_d_imag = i; m_d_real = r; cout << "Me han creado con " << *this << endl; } CComplejo::~CComplejo(){ cout << "Me han eliminado " << *this << endl; } this es un puntero al objeto en ejecucin
Clases y objetos - 36
Clases y objetos - 37
Funciones miembro de una clase Representan los mtodos a travs de los cuales se establece relacin con el objeto. El nombre de la funcin representa la accin a realizar por el objeto. Para mantener la integridad del objeto, toda comunicacin con el objeto debera ser a travs de la funciones miembro: Si una funcin externa a la clase quiere acceder a informacin interna como es el caso de >> o << de iostream debe ser declarada como amiga en la zona pblica (friend). Se pueden sobrecargar los nombres de las funciones.
Clases y objetos - 38
Siempre que se pueda se pasan los objetos por referencia No olvidarse del uso de const
Clases y objetos - 39
Clases y objetos - 40
Me han creado con (2,3) Me han creado por defecto Operador igualdad Me han creado por copia de (2,3) Me han creado por defecto Suma de complejos Operador igualdad Me han creado por copia de (2,4) Me han eliminado (2,4) Me han eliminado (2,3) Operador igualdad Me han eliminado (2,4) C3: (2,4) Me han eliminado (2,4) Me han eliminado (2,3) Me han eliminado (0,1) Clases y objetos - 41
Clases y objetos - 42
CComplejo& CComplejo::operator+(const CComplejo& c){ m_d_real+=c.m_d_real; m_d_imag+=c.m_d_imag; cout << "Suma de complejos" << endl; return *this; }
Clases y objetos - 44
Clases y objetos - 45
Clases y objetos - 46
Me han creado con (0,1) Me han creado con (2,3) Suma monaria de complejos C1: (2,4) Me han eliminado (2,3) Me han eliminado (2,4)
Clases y objetos - 47
Clases y objetos - 48
Sobrecarga de operadores Los operadores de C++ funcionan exactamente igual que una funcin:
CComplejo C1,C2,C3; C1=C2+C3; C1.operator=(C2.operator+(C3));
Siempre hay definido por defecto: = y & para cualquier clase (por supuesto, se pueden sobrecargar). Permiten definir un lgebra de los objetos de una clase. No se debe abusar. Si a partir del operador no se sabe claramente la accin a realizar es mejor utilizar funciones.
Clases y objetos - 49
Ejercicios con operadores Definir el operador > de CComplejo Definir el operador+ pero que sea friend de CComplejo Definir el operador + para trabajar con punteros de CComplejo
En C++ las funciones pueden tener el mismo nombre, si los parmetros son distintos
Clases y objetos - 50
Clases y objetos - 52