420 likes | 888 Views
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++. LAS CLASES EN C++. Estructura de una clase. class <nombre> { private : <datos privados> <métodos privados> public : <datos públicos> <método públicos> protected : <datos protegidos> <método protegidos> };. Ejemplo. class Uno {
E N D
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++ LAS CLASES EN C++
Estructura de una clase class <nombre> { private: <datos privados> <métodos privados> public: <datos públicos> <método públicos> protected: <datos protegidos> <método protegidos> };
Ejemplo class Uno { private: int k; float x; public: void procedure(int x); int function(); }; Uno a, *b;
Ejemplo class Empleado { private: char *nom; char *app; float sueldo; public: void verDatos(); float obtenerSueldo(); };
Conceptos • Especificador de acceso: • public: • private: • protected: • Ningún miembro podrá ser objeto de la clase que está siendo declarada • Ningún miembro puede declararse como: • auto • extern • register
Control de acceso Métodos de cualquier clase Métodos de la clase y sus derivadas Métodos de la clase public: protected: private:
Métodos Los métodos se pueden implementar: • Dentro de la definición de la clase • A continuación de la definición de la clase Tipo Método(parámetros) { sentencias } Tipo Nombre_Clase::Método(parámetros) { sentencias }
Mensajes • Mecanismo mediante el cual el usuario solicita a un objeto que ejecute alguna acción • El objeto, si reconoce el mensaje, activa el método adecuado en respuesta al mensaje objeto.método_público(argumentos)
Interfaz • Mecanismo mediante el cual un objeto puede comunicarse con el medio • Se materializa a través de los métodos públicos de la clase public: Fraccion(); void Listar(); int Numerador(); int Denominador(); float Equivalente();
Clase Fraccion • Numerador • Denominador != 0 • Ambos enteros • Crear una fracción con datos desde el teclado • Conocer su numerador • Conocer su denominador • Obtener su equivalente real
f: f1: f2: num: 5 den: 7 num: 1 den: 2 num: 3 den: 8 Listar() Numerador() Denominador() Equivalente() Listar() Numerador() Denominador() Equivalente() Listar() Numerador() Denominador() Equivalente() Objetos de clase Fraccion
f 1 3 0,333 Equivalente Listar() Numerador() Denominador() Equivalente() Mensajes
Constructor Métodos Atributos Clase Fraccion class Fraccion { public: Fraccion(); void Listar(); int Numerador(); int Denominador(); float Equivalente(); private: int num; int den; }
Sobrecarga de Constructores • Igual nombre de funciones • Se diferencian en : • La cantidad de parámetros y • Tipo de dato de los parámetros class Fraccion { public: Fraccion(); Fraccion(int,int); void Listar(); i nt Numerador(); … }
Fraccion() Fraccion(int x=0,int y=1) Fracción f; Constructores por defecto • No poseen argumentos, o • Los argumentos tienen valores asignados
Clase Fraccion class Fraccion { public: Fraccion(); Fraccion(int,int); void Listar(); int Numerador(); int Denominador(); float Equivalente(); private: int num; int den; }
Uso de la clase Fraccion Constructores int main() { Fraccion f; Fraccion g(2,3); f.Listar(); cout<<f.Numerador(); cout<<"Equivalente de: "<<endl; cout<<f.Numerador()<<" /" <<f.Denominador() <<": "; cout<<f.Equivalente()<<endl; cout<<g.Numerador()<<" /" <<g.Denominador() <<": "; cout<<g.Equivalente()<<endl; return 0; } Mensaje
Creación de objetos Estático: Fraccion f1; x = f1. Numerador( ); Dinámico: Fraccion *f1; f1 = new Fraccion( ); x = (*f1).Numerador( ); x = f1->Numerador();
Destructores • Utilidad: • Liberar recursos solicitados por el constructor • Objetos en el heap se destruyen con el operador delete • Nose requiere implementar si no se utiliza almacenamiento dinámico como parte del objeto • Se invoca implícitamente cuando finaliza el bloque en fue declarado el objeto
// Creación de f1 // Creación de f2 // Destrucción de f2 // Destrucción de f1 Uso de destructores int main() { int n,d; Fraccion f1; f1.Imprimir(); cout << f1.Equivalente() << endl; do { cout << "Numerador : "; cin >> n; cout << "Denominador: "; cin >> d; if (d!=0) { Fraccion f2(n, d); f2.Imprimir(); cout << f2.Equivalente() << endl; } } while (d!=0); return 0; }
Clase Complejo class Complejo { private: float real; float imag; public: Complejo(); Complejo(float); Complejo(float, float); Complejo(Complejo &); void setR(float); void setI(float); float getR(); float getI(); void verComplejo(); ~Complejo(); // Alt 126 };
Implementación clase Complejo Complejo::Complejo() { real = 0; imag = 0; } Complejo::Complejo(float x) { real = x; imag = 0; } Complejo::Complejo(float x, float y) { real = x; imag = y; } Complejo::Complejo(Complejo &C) { real = C.real; imag = C.imag; } void Complejo::setR(float x) { real = x; }
Implementación clase Complejo void Complejo::setI(float y) { imag = y; } float Complejo::getR() { return real; } float Complejo::getI() { return imag; } void Complejo::verComplejo() { cout << " Complejo como par ordenado: " << endl; cout << " (" << real << ", " << imag << ") " << endl; cout << " Complejo en forma binomial: " << endl; cout << real << " + " << imag << "i" << endl; } Complejo::~Complejo() { cout << " Eliminando complejo " << endl; }
Uso clase Complejo int main(int argc, char *argv[]) { Complejo C0, C1(1.1), C2(2.1, 2.6), C3(3.1, 3.6); Complejo C4 = C1; Complejo *q, *p = new Complejo(C2); C0.verComplejo(); C1.verComplejo(); C2.verComplejo(); C3.verComplejo(); C4.verComplejo(); C0 = *p; C0.verComplejo(); *q = C1; (*p).verComplejo(); (*q).verComplejo(); delete p; delete q; return 0; }
Clase Fecha class Fecha { private: int dd; int mm; int aa; public: void setDia(int); void setMes(int); void setAño(int); int getDia(); int getMes(); int getAño(); void verFecha(); };
Clase Empleado class Empleado { private: char *nombre; char *direccion; long sueldo; Fecha nacim; Fecha contrat; public: void setNombre(char *); void setDireccion(char *); void setSueldo(long); void setNac(Fecha); void setCont(Fecha); char *getNombre(); char *getDireccion(); long getSueldo(); Fecha getNac(); Fecha getCont(); void verEmpleado(); };
Implementación clase Fecha void Fecha::setDia(int d) { dd = d; } void Fecha::setMes(int m) { mm = m; } void Fecha::setAño(int a) { aa = a; } int Fecha::getDia() { return dd; } int Fecha::getMes() { return mm; } int Fecha::getAño() { return aa; } void Fecha::verFecha() { cout << “ Dia: " << dd << “ Mes: " << mm << “ Año: " << aa << endl; }
Implementación clase Empleado void Empleado::setNombre(char *nom) { nombre = new char[strlen(nom)+1]; strcpy(nombre, nom); } void Empleado::setDireccion(char *dir) { direccion = new char[strlen(dir)+1]; strcpy(direccion, dir); } void Empleado::setSueldo(long suel) { sueldo = suel; } void Empleado::setNac(Fecha f) { nacim = f; } void Empleado::setCont(Fecha f) { contrat = f; } char *Empleado::getNombre() { return nombre; }
Implementación clase Empleado char *Empleado::getDireccion() { return direccion; } long Empleado::getSueldo() { return sueldo; } Fecha Empleado::getNac() { return nacim; } Fecha Empleado::getCont() { return contrat; } void Empleado::verEmpleado() { cout<<"Nombre: "<< nombre << endl; cout<<"Direccion: "<< direccion << endl; cout<<"Sueldo: "<< sueldo << endl; cout<<"Fecha de nacimiento "<< endl; nacim.verFecha(); cout<<"Fecha de contratacion "<< endl; contrat.verFecha(); }
Uso clase Empleado int main(int argc, char *argv[]) { Empleado E; Fecha F, G; char *c = new char[10]; long d, m, a, s; cout<<"Ingrese nombre: "; cin.getline(c,10); E.setNombre(c); cout<<"Ingrese direccion: "; cin.getline(c,10); E.setDireccion(c); cout<<"Ingrese sueldo: "; cin>>s; E.setSueldo(s); cout<<"Ingrese fecha de nacimiento "<< endl; cout << " Dia: "; cin >> d; cout << " Mes: "; cin >> m;
Uso clase Empleado cout << " Año: "; cin >> a; F.setDia(d); F.setMes(m); F.setAgno(a); E.setNac(F); cout<<"Ingrese fecha de contratacion "<< endl; cout << " Dia: "; cin >> d; cout << " Mes: "; cin >> m; cout << " Agno: "; cin >> a; G.setDia(d); G.setMes(m); G.setAgno(a); E.setCont(G); E.verEmpleado(); return 0; }