Академический Документы
Профессиональный Документы
Культура Документы
Tema2:Clasesdeobjetos
1.Implementacindeunaclase
1.DescripcindeunaclaseenC++ 2.Elementospblicosyprivados 3.Accesoaatributos 4.Clasesamigas 5.Implementacindelasoperaciones 6.Funcionesmiembroinline 7.OrganizacindelcdigoenC++
2.Inicializacinyfinalizacindeclases
1.Constructores 2.Destructores
ClasesdeObjetos
Implementacindelasclases
Partiendodeldiseoorientadoaobjetosdeun sistema,latareabsicaalaquenosenfrentamos durantelafasedeimplementacineslatraduccinde cadaclaseallenguajedeprogramacinorientadoa objetosqueestemosutilizando
Cuenta nmero:string titular:string saldo:float intersAnual:float ingreso(cantidad:float) reintegro(cantidad:float) ingresoInteres() estaEnRojos():bool verSaldo():float
ClasesdeObjetos
DescripcindeunaclaseenC++
Ficherocuenta.h
class Cuenta { char numero[20]; char titular[80]; float saldo; float interes; public: void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos(); float verSaldo(); };
Atributos(variablesmiembro)
Cuenta nmero:string titular:string saldo:float inters:float +ingreso(cantidad:float) +reintegro(cantidad:float) +ingresoInteres() +estaEnRojos():bool +verSaldo():float
Operaciones(funcionesmiembro)
ClasesdeObjetos
Elementospblicosyprivados
Seccinpublic(pblica):miembrosaccesiblesdesde elexteriordelaclase.Smbolo+enUML Seccinprivate(privada):protegeloselementoscuyo accesodesdeelexteriornoestpermitido.Por defectotodossonprivados.SmboloenUML
class Cuenta { private: char numero[20]; char titular[80]; float saldo; float interes; public: void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos(); float verSaldo(); };
Seccinpblica
4
ClasesdeObjetos
Lasutilidaddelasoperacionesprivadasesservir comoauxiliaresaotrasoperacionesdelaclase
Funcinmiembroprivada auxiliar(usadapor ingresoyreintegro)
class Cuenta { char numero[20]; char titular[80]; float saldo; float interes; void modificarSaldo(float cantidad); public: void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos(); float verSaldo(); };
ClasesdeObjetos
Accesoaatributos.Atributospblicos
Enmuchasocasionesesnecesarioqueelvalorde unatributoseavisibledesdeelexteriorparalectura Establecercomounatributocomopblicoesposible, peropocorecomendable
Elatributopuedesermodificadodesdeelexteriorsinningncontrol Seestableceunadependenciaentrelarepresentacininternadelaclaseyel exterior
class Cuenta { char numero[20]; char titular[80]; float interes; public: float saldo; void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos(); };
6
ClasesdeObjetos
ClasesdeObjetos
Clasesamigas
Avecesdosclasesestntanntimamente relacionadasqueunarequiereaccesototalavarios atributosyoperacionesprivadosdelaotra. Esteaccesopuedegarantizarsepermitiendoel accesoabsolutodeformaselectivasloa determinadasclases,denominadasamigas
LaclaseInformeCuentarealizauninformeimpresodelestadode unaCuentacontodossusdatos.Paraellonecesitaaccederatodoslos atributosdelaclase,perostossonprivadosynoexistenentodosloscasos operacionesparaobtenersuvalor
ClasesdeObjetos
Solucin:hacerlaclaseInformeCuentaamigadeCuentaparaquetenga accesocompletoasusatributos
ClasesdeObjetos
ApartirdeahoralaclaseInformeCuentaesamigadeCuentaytiene accesocompletoasusatributosprivadosyobviamentepblicos
class Cuenta { char numero[20]; char titular[80]; float saldo; float interes; public: friend class InformeCuenta; void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos(); float verSaldo(); };
10
ClasesdeObjetos
Implementacindelasoperaciones
Dependiendodellenguajedeprogramacin,la implementacindelasoperacionesserealizaenel mismositioquelainterfazdelaclase(Java,Eiffel)o enficherosseparados,comoenC++:
Ficherocuenta.cpp
void Cuenta::ingreso(float cantidad) { saldo += cantidad; } void Cuenta::reintegro(float cantidad) { saldo -= cantidad; }
11
ClasesdeObjetos
12
ClasesdeObjetos
Funcionesinline(enlnea)
Unallamadaaunafuncinmiembroinlinegeneraun cdigomuyeficienteyaquenogenerarealmenteuna llamadaninecesitacdigodepreparacindesta
Generacindecdigoenuna llamadaafuncinordinaria
... MOV B, A CALL ver_saldo SUM B, 30H ...
Generacindecdigoenuna llamadaafuncininline
... MOV B, A MOV AX, saldo SUM B, 30H ...
Cuenta::verSaldo()
MOV AX, saldo PUSH AX RETURN
13
ClasesdeObjetos
14
ClasesdeObjetos
OrganizacindelcdigoenC++
Lainterfazdelaclaseseincluyeenunficherodecabecera
// -----------------------------------------// cuenta.h - Interfaz de la clase Cuenta // -----------------------------------------#ifndef CUENTA_H #define CUENTA_H class Cuenta { char numero[20]; char titular[80]; float saldo; float interes;
// Variables miembro
public: // Funciones miembro void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos() { return saldo < 0; } float verSaldo() { return saldo; } }; #endif
15
ClasesdeObjetos
ClasesdeObjetos
Inicializacindeunaclase
Yasabemoscomodefiniratributosenunaclase, peroquevalorinicialtienenestosatributoscuando enelmomentodelacreacindeunobjetodedicha clase? Esnecesariopoderinicializarunobjetoantesde comenzaratrabajarconl.Lastareastpicasenla inicializacinson:
Inicializacindeatributos Asignacindememoriadinmica Aperturadearchivos
17
ClasesdeObjetos
Unaprimerasolucinconsisteendefiniruna operacindeinicializacindelaclase
void Cuenta::inicializar(char *anumero, char *atitular, float asaldo, float ainteres) { strcpy(numero, anumero); strcpy(titular, atitular); saldo = asaldo; interes = ainteres; }
Estanoesunasolucinfiable:
Obligaalusuarioaconocercualeslafuncinmiembrodeinicializacindelobjeto, quepuedetenermuchosnombres:inicializa,inicializar,nueva,crear,etc. Sielusuarioolvidallamaralafuncinmiembrodeinicializacintras crearelobjetosurgirnmuchosproblemas...
18
ClasesdeObjetos
ClasesdeObjetos
Laimplementacindelconstructordenuestraclase seralasiguiente:
Cuenta::Cuenta(char *anumero, char *atitular, float asaldo, float ainteres) { strcpy(numero, anumero); strcpy(titular, atitular); saldo = asaldo; interes = ainteres; }
Ejemplos:
ClasesdeObjetos
ClasesdeObjetos
Laimplementacindelsegundoconstructorsera:
Cuenta::Cuenta(char *anumero, char *atitular, float asaldo) { strcpy (numero, anumero); strcpy (titular, atitular); saldo = asaldo; interes = 1; }
Vamosaaadiruntercerconstructorparaleerlos datosdelacuentadesdeunfichero
class Cuenta { char numero[20]; char titular[80]; float saldo; float interes; public: // Constructor para nuevas cuentas de cualquier tipo Cuenta(char *anumero, char *atitular, float asaldo, float ainteres); //Sigue...
22
// Constructor para nuevas cuentas corrientes (interes = 1) Cuenta(char *anumero, char *atitular, float asaldo); // Constructor para cuentas ya existentes, almacenadas en disco Cuenta(char *anumero); void ingreso(float cantidad); void reintegro(float cantidad); void ingresoInteres(); int estaEnRojos() { return saldo < 0; } float verSaldo() { return saldo; } }; Cuenta::Cuenta(char *anumero) { char nombref[80]; strcpy(numero, anumero); strcpy(nombref, anumero); strcat(nombref, ".cnt"); // Abrir el fichero de la cuenta ifstream in (nombref); if (!in) exit (1); // Leer los valores de las variables miembro getline(in, numero); getline(in, titular); in >> saldo; in >> interes; }
ClasesdeObjetos
23
ClasesdeObjetos
24
ClasesdeObjetos
EnellenguajeEiffelestoesposible,yaquecada constructorpuedetenerunnombredistinto:
-- Constructor general de la clase Cuenta crear(anumero, atitular: STRING; asaldo: INTEGER; ainteres: REAL) is do ... End -- Constructor para cuentas corrientes (interes = 1) crearCorriente(anumero, atitular: STRING; asaldo: INTEGER) is do ... end -- Constructor para cuentas de ahorro (interes = 8) crearAhorro(anumero, atitular: STRING; asaldo: INTEGER) is do ... end
25
ClasesdeObjetos
26
ClasesdeObjetos
ClasesdeObjetos
Ejemplodeconstructorconlistadeargumentosvaca
class Fecha{ int dd, mm, aa; public: Fecha():dd(1),mm(1),aa(2000){}; ... }
Unconstructorcopiaesaquelquesirveparacrear unobjetoexactamenteigualqueotro
Cuenta::Cuenta(Cuenta& c) { strcpy(numero, c.numero); strcpy(titular, c.titular); saldo = c.saldo; interes = c.interes; }
28
ClasesdeObjetos
Finalizacindeunaclase
Demaneraanlogaalainicializacin,muchas vecesesnecesariorealizarciertastareasantesde ladestruccindeunobjetodeunaclasetrassuuso:
Liberacindememoriadinmicaasignadadurantelavidadelobjeto Cierredeficheros,liberacinengeneraldecualquierrecursodelsistema Salvarelcontenidodelobjetoendiscooenunabasededatos
ClasesdeObjetos
ClasesdeObjetos
ClasesdeObjetos
Estaeslaimplementacindeldestructor:
Cuenta::~Cuenta () { char nombref[80]; strcpy(nombref, numero); strcat(nombref, ".cnt"); // Abrir el fichero de la cuenta para escritura // (Obviamos la comprobacin de errores) ofstream out(nombref); // Escribir los valores de las variables miembro out << titular << endl << saldo << endl << interes << endl; }