520 likes | 813 Views
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++. PROYECTOS EN C++. Construcción de un proyecto. Un proyecto se construye separando la interfaz (definición) de la implementación de una clase La interfaz debe crearse como header (archivo con extensión .h )
E N D
Construcción de un proyecto • Un proyecto se construye separando la interfaz (definición) de la implementación de una clase • La interfaz debe crearse como header (archivo con extensión .h) • Uso en la implementación y en el mismo proyecto: • Uso en otro proyecto incluir la respectiva ruta de acceso: #include "nombre.h" #include "path\nombre.h"
Interfaz // Interfaz de la clase Par en archivo defpar.h class Par { private: // Atributos int x, y; public: // Métodos Par(); Par(int, int); int mas(); int por(); void verM(); void verP(); };
Implementación // Implementación de la clase Par en archivo imp.cpp #include <iostream> #include "defpar.h" Par::Par() { x = 0; y = 0; } Par::Par(int a, int b) { x = a; y = b; } int Par::mas() { return x + y; }
Implementación int Par::por() { return x*y; } void Par::verM() { cout << x << " + " << y << " = " << mas(); } void Par::verP() { cout << x << " * " << y << " = " << por(); }
Uso // Uso de la clase Par en archivo uso.cpp #include "defpar.h " int main() { Par *p = new Par(); Par *q = new Par(4, 8); (*p).verM(); (*p).verP(); (*q).verM(); (*q).verP(); return 0; }
Métodos constantes • Un método constante NOpuede modificar los atributos del objeto <tipo> <nombre>(<parámetros>) const;
Interfaz de la clase Hora class Hora { public: Hora(int=0, int=0, int=0); void AsignaHora(int); void AsignaMin(int); void AsignaSeg(int); void MuestraHora() const; void MuestraMin() const; void MuestraSeg() const; private: int hh; int mm; int ss; };
Implementación de la clase Hora Hora::Hora(int h, int m, int s) { hh = (h>=0 && h<24) ? h:0; mm = (m>=0 && m<60) ? m:0; ss = (s>=0 && h<60) ? s:0; } void Hora::AsignaHora(int h) { hh=h; } void Hora::AsignaMin(int m) { mm=m; } void Hora::AsignaSeg(int s) { ss=s; }
Implementación de la clase Hora void Hora::MuestraHora() const { cout << hh << " horas "; } void Hora::MuestraMin() const { cout << mm << " minutos "; } void Hora::MuestraSeg() const { cout << ss << " segundos "; }
Objetos constantes • Declaración de variables NO modificables por asignación • Si la variable es un atributo, ninguno de los métodos puede modificarla const <tipo> <variable>;
Error Intento de modificar objeto constante Uso de la clase Hora int main() { const Hora x(12,3,10); x.AsignaHora(9); x.AsignaMin(34); x.AsignaSeg(22); Hora y; y.AsignaHora(5); y.AsignaMin(3); y.AsignaSeg(16); return 0; }
Constructores • Un constructor es un método cuyo nombre es el mismo de su clase • Se activa implícitamente para crear un objeto • Permite dar valores iniciales a los atributos • No es una función que retorne un valor • Si en la clase No se define un constructor, el compilador proporciona un constructor de oficio(por omisión)
Constructores • Puede sobrecargarse • Invocación implícita • Invocación explícita Fraccion f; Fraccion f(3, 7); Fraccion g = Fraccion(); Fraccion h = Fraccion(4, 9);
Viola el principio de encapsulamiento Constructores Fraccion f; f.num=6; Fraccion f(5,3); Fraccion f= Fraccion(5,3); Fraccion *f=new Fraccion; Fraccion *g; g=new Fraccion(2,5);
Constructores Fraccion::Fraccion(int x,int y) { SetNum(x); SetDen(y); } Fracción::Fraccion(int x,int y) { num=x; den=y; }
Inicializadores Sección de inicialización • Ocultan la asignación explícita • Son de gran utilidad: • Para inicializar objetos constantes • En clases derivadas (herencia) Fraccion::Fraccion(int x,int y) : num(x), den(y) { // puede ir el cuerpo vacío }
Uso de Inicializador cuya forma es atributo(valor) Atributos constantes • La declaración de atributos constantes se realiza para impedir que un método efectúe una modificación de sus valores
Interfaz de la clase Incremento class Incremento { public: Incremento(int c=0, int k=1); void Increm(); void Decrem(); void Listar() const; private: int cont; const int inc; };
Implementación de la clase Incremento Incremento::Incremento(int c, int k): inc(k) { cont=c; } void Incremento::Increm() { cont+=inc; } void Incremento::Decrem() { cont -=inc; } void Incremento::Listar() const { cout<<"contador: "<<cont<<endl; cout<<"incremento: "<<inc<<endl; }
Uso de la clase Incremento int main() { Incremento x(1,5); int i; x.Listar(); for (i=1;i<=6;i++) x.Increm(); cout<<"Después de "<< i<<" incrementos: "; x.Listar(); x.Decrem(); x.Listar(); return 0; }
Tipos de constructores • Por Defecto • Con Argumentos • De Copia
Constructor por Defecto • Un constructor por defecto puede ser: • De Oficio • Sin Parámetros • Con Parámetros
Constructor por Defecto • Constructor de Oficio • Existe por omisión • Lo incorpora automáticamente el compilador, si el usuario Nodefine ningún constructor • Inicializa los atributos según los valores por omisión establecidos por el lenguaje
Constructor por Defecto class Fraccion { private: int num; int den; public: Fraccion(); … }; • Constructor sin Parámetros • Inicializa los atributos con valores por defecto
Constructor por Defecto Fraccion::Fraccion() { num=0; den=1; } • Implementación • Composición FraccionV[100];
Constructor por Defecto Fraccion(int x=0,int y=1) • Constructor con Parámetros • Los parámetros formales tienen asignado un valor por defecto en la declaración del método • Declaraciones permitidas: Fraccion f; Fraccion g(3); Fraccion h(2, 5);
Constructor con Argumentos Fraccion(int x) Fraccion(int x,int y=1) • Prototipos • Declaraciones permitidas int a=3, b=6, c=9; Fraccion g(a); Fraccion h(b, c);
Constructor de Copia • Permite crear un objeto e inicializarlo a partir de otro objeto de la misma clase • Tiene, como único parámetro, un objeto de su clase el cual se utilizará en la inicialización • El compilador provee un constructor de copia de oficio que efectúa la copia de los atributos del objeto original en el nuevo
Constructor de Copia • Su único parámetro es una referencia constante a un objeto de la clase Fraccion (const Fraccion &) Fraccion::Fraccion(const Fraccion &k) { num = k.num; den = k.den; } Fraccion f1(f2);
Alumno a1; Alumno a2; class Alumno { private: char *nom; int mat; float prom; ... } *nom: mat: 12345 prom:4.7 "Serapio Jento" *nom: mat: 12345 prom:4.7 Constructor de Copia
Destructor • Complemento del constructor • No es una función void o que retorne un valor • No puede sobrecargarse pues es único • No posee argumentos • Tiene el mismo nombre de la clase precedido del símbolo ~ ~Clase ()
Destructor • Es llamado implícitamente cuando finaliza el bloque que determina el alcance del objeto • Los objetos creados dinámicamente (new) deben eliminarse explícitamente con delete • El compilador provee un destructor, excepto para liberar memoria dinámica Clase::~Clase () { delete [] v; }
Interfaz class Alumno { private: char *nom; int matr; double prom; public: Alumno(); Alumno(char *, int); void Listar(); ~Alumno(); };
Implementación Alumno::Alumno(char *x, int m=0) { nom = new char[strlen(x)+1]; strcpy(nom, x); matr=m; prom=0.0; } Alumno::~Alumno() { delete [] nom; }
Uso int main() { Alumno a("Juan"); Alumno b("María", 1234); a.Listar(); b.Listar(); return 0; }