Академический Документы
Профессиональный Документы
Культура Документы
class nombredelaclase {
public:
private:
};
Veamos nuestra primera clase de ejemplo: La clase fracción, que representará una fracción
matemática. ¿Qué atributos tiene una fracción matemática? Pues un denominador y
un numerador
Composición de Clases
Relación de pertenencia.
Encapsulamiento
En la programación clásica (lenguaje C, p.e.) existen datos y procedimientos que actúan sobre
esos datos. No hay una relación aparente entre datos y procedimientos (funciones) y esta
relación se establece de manera más o menos precisa de acuerdo a la profesionalidad del
programador.
En P.O.O. los datos y los procedimientos que los gestionan están relacionados explícitamente y
se "encapsulan" en un objeto. La especificación de las propiedades de un objeto y los métodos
de acceso se realiza en la declaración de la clase de la que se instancia el objeto.
En la figura esquematizamos las propiedades y métodos que se van a asociar a los objetos de
la clase TObjGraf:
Clases
Private:
Por el concepto de encapsulación. No queremos que nadie desde fuera pueda tocar nuestro
numerador o nuestro denominador sin nuestro permiso. Como observan he colocado la clase
fracción dentro de un archivo llamado fracción.h, que irá separado de nuestro main. Vamos a
crear el main para que tengamos un programa que se pueda ejecutar:
Al ejecutar la consola muestra una apariencia negra. Si observáis hemos creado un objeto de la
clase fracción, concretamente el objeto unafraccion. Vamos a hacer algunos métodos para
empezar a interactuar con la clase:
Clase Mixto
class Mixto
{public:
Mixto();
Fraccion Equivalente();
float Equivalente();
void Listar();
private:
int ent;
Fraccion f;
};
Clase Curso
class Curso
{public:
Curso(int t=30);
void Inscribir(Alumno&);
double Promedio();
int Aprobados();
int Reprobados();
private:
int N;
char nom[25];
char cod[7];
Alumno v[50];
};
Plantillas de Funciones
Mecanismo para implementar funciones genéricas
template <classT>
tipo nombre(parámetros)
{sentencias}
Ejemplo
{T aux;
aux= a;
a= b;
b= aux;
Plantillas de Funciones
void ()
{ int V[5];
Crear(V,5);
Listar(V,5);
float X[4];
Crear(X,4);
Listar(X,4);
char C[6];
Crear(C,6);
Listar(C,6);
Plantillas de Funciones
template <class T>
cin>>v[i];
cout<<v[i];
Plantillas de clases
Mecanismo para implementar Clases genéricas
template<class T>
class nombre
{private:
Métodos
Variables
public:
Métodos
Variables
Métodos
template <class T>
Stack<T>::Stack(int s)
{largo = s;
top = -1;
p=new T[largo];
bool Stack<T>::Push(T e)
{ if (!Full())
{ p[++top]=e;
return true;
return false;
{ Stack<int> S,S2;
Poblar(S);
Listar(S);
S2=S;
Listar(S2);
Stack<float> S3;
Poblar(S3);
Listar(S3);
Invertir(S3);
Ordenar(S1,S2)
CONSTRUCTORES Y DESTRUCTORES
Son métodos 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 ningún valor.
El constructor debe llamarse igual que la clase, y el destructor el nombre de la clase precedido
del carácter ~
Un constructor se ejecuta cuando se crea un nuevo objeto: 1) por declaración, ó 2) cuando se
crea dinámicamente con el operador new. Un destructor se ejecuta cuando el objeto deja de
existir: 1) porque su ámbito acaba, ó 2) cuando se libera explícitamente con el operador
delete.
Herencia
Cuando una clase hereda de otra, la clase derivada incorpora todos los miembros de la clase
base además de los suyos propios.
Ejemplo: De una clase TObjGraf se van a construir dos nuevas clases, TCirculo y TCuadrado,
que derivan de TObjGraf. Esto significa que los objetos de estas clases tienen asociados las
propiedades y métodos de la clase base, TObjGraf, además de los suyos propios. En la figura
5.3 esquematizamos el mecanismo de herencia para las nuevas clases y las nuevas
propiedades que se asocian a los objetos de las clases derivadas.
//*************************************************/
//*************************************************/
public:
};
//*************************************************/
//*************************************************/
class TCuadrado : public TObjGraf {
public:
};
Antes del nombre de la clase base hay que poner public, esto es así porque C++ permite
también la herencia private. Pero ésta no se suele usar, por lo que nosotros supondremos que
sólo existe la public.
CONSTRUCTOR
Es un método que sirve para inicializar los atributos de una clase al valor que se quiera cuando
ésta es creada. Los constructores son un tanto especiales, por varios motivos:
¿Y por qué hacer un constructor?. Para mantener nuestra clase consistente. Cuando se
programa una clase es importante que desde su creación hasta su destrucción sea consistente,
es decir, que no ocasione errores ni estados no posibles. Nuestra clase fracción es
inconsistente en éste momento porque tiene un denominador 0, y si construimos un método
que devuelva la división de los dos atributos, provocará un error. Con el constructor
inicializaremos nuestra clase a 1 de la siguiente manera:
Constructor Alumno
Alumno::Alumno()
{k=0; t=0;}
{strcpy(nom,n);
strcpy(rut,r);
mat=m;
carrera=c;
k=0;
t=0;
Curso::Curso(int t)
{N=t;
cin.getline(nom,25);
cin.getline(cod,7);
char x, y;
int z,c;
Alumno a(x,y,z,c);
v[i]= a; }}
Listar
void Curso::Listar()
{Curso C;
C.Listar();
void main()
{Curso C;
C.Listar();
Composición de clases
objetos de clase Fecha
class Fecha
{private:
int dia;
int mes;
int año;
int ValidaDia();
public:
Fecha(int,int,int);
void Imprimir();
class Empleado
{private:
char nom;
char app;
float sueldo;
Fecha fnac;
Fecha fcontr;
public:
void Imprimir();
}
Composición de clases
Los constructores inicializan miembros de datos.
Por lo tanto, ANTES de inicializar los datos de la clase contenedora (Mixto, Curso,
Empleado) deberán inicializarse aquellos datos que sean objetos de otras clases, por
medio, de sus constructores.
INLINE
El camino de c++ es largo, pero se sigue avanzando. Veamos las funciones inline, un
recurso interesante para mejorar el rendimiento.
//Variables globales
int main () {
//Tomamos el valor a
cin >> a;
//Tomamos el valor b
cin >> b;
cout << "Y ahora son estos: b=" << b << " a=" << a << " global:" << variable << "Y el";
//Probamos la funcion
Log("Venga va vamos");
return 0;
}
DOUBLE
a *= 35462;
b *=32546 + a;
return (a / b) * variable;
}
/**
Log
devuelve void
*/
}
Sobrecarga de operadores
Esto se utiliza para hacer que un operador (+, -, *, /, etc.) haga mas cosas que sumar números
enteros, decimales, etc. Podemos hacer que nos sume matrices, vectores, etc. Si definimos el
operador + para que sume matrices, no dejará de hacer lo que hacia antes (sumar enteros,
decimales, etc.).
tipo_a_devolver nombre_clase::operator(parámetros);
Sobrecarga de operadores
Esto se utiliza para hacer que un operador (+, -, *, /, etc.) haga mas cosas que sumar números
enteros, decimales, etc. Podemos hacer que nos sume matrices, vectores, etc. Si definimos el
operador + para que sume matrices, no dejará de hacer lo que hacia antes (sumar enteros,
decimales, etc.).
La forma para definir la función sobrecargada es:
tipo_a_devolver nombre_clase::operator(parámetros);
Sobrecarga de operadores
Fracciones f=f1 + f2
Complejos c=c1 + c2
Operadores de flujo:
Fracciones cout<<f;
Complejos cin>>c;
Restricciones
No es posible sobrecargar:
If aritmético (? :)
Operador sizeof
Restricciones
Se puede modificar la definición de un operador, pero NO su gramática (número de
operandos, precedencia y asociatividad)
El operador sobrecargado
1. Operador Miembro
a) f1 + f2
b) f5 * f3
Ejemplo
class Fraccion
{public:
void Imprimir();
void SetNum(int);
void SetDen(int);
int Numerador();
int Denominador();
void Simplificar();
private:
int num;
int den;
int mcd();
};
Ejemplo
Fraccion operator+(const Fraccion&);
{ Fraccion g;
g.num=f.num*den + num*f.den;
g.Simplificar();
return g;
}
Ejemplo
class Fraccion
{public:
void Imprimir();
void SetNum(int);
void SetDen(int);
int Numerador();
int Denominador();
void Simplificar();
private:
int num;
int den;
int MCD();
};
Ejemplo
Fraccion& operator+ (const Fraccion&);
Simplificar();
return *this;
};
El operador sobrecargado
2. Operador Friend
Función "Amiga" de la clase
b) f5 * f3
Ejemplo
class Fraccion
{public:
void Imprimir();
void SetNum(int);
void SetDen(int);
int Numerador();
int Denominador();
void Simplificar();
private:
int num;
int den;
int MCD();
};
Ejemplo
friend Fraccion operator+ (const Fraccion&,const Fraccion&);
{Fraccion h;
h.den= g.den*f.den
return h;
}
SOBRECARGA DE
OPERADORES DE
RELACIÓN
Ejemplo: Sobrecargar ==
{return (num*f.den==den*f.num);
a) if (f1==f2)
b) x= (f1==f2);
SOBRECARGA DEL
OPERADOR DE
ASIGNACIÓN
Ejemplo: Sobrecargar =
{ if (this!=&f)
{num= f.num;
den= f.den;
return *this;
f1= f2;
Diferencia
{num=k.num;
den=k.den;
}
Fraccion f(3,4);
Fraccion g(f);
Diferencia
b) El operador de asignación
Protege contra la "auto-asignación"
{ if (this!=&f)
{num= f.num;
den= f.den;
}
return *this;
}
SOBRECARGA DE
OPERADORES
<< - >>
cout <<f;
cin>>f;
b) Que el método retorne la dirección del objeto para que se pueda utilizar varias veces en una
expresión
return sal;
cout <<f;