Lenguaje de Programación Orientado a Objetoshilario_sm/slide/Programacion_2/Unidad III.pdf ·...
Transcript of Lenguaje de Programación Orientado a Objetoshilario_sm/slide/Programacion_2/Unidad III.pdf ·...
3.1 Tipos de datos primitivos
3.2 Declaración de clases y subclases
3.3 Declaración de herencia e interfaces
3.4 Relaciones entre clases
3.5 Clases y métodos genéricos
Lenguaje de Programación Orientado a Objetos
3.1 Tipos de datos primitivos
Aspectos básico de C++
OPERADORES DE ASIGNACIÓN
En el caso de los post-incrementos y post-decrementos pasa lo contrario: se
utilizará el valor actual del operando y luego se efectuará la operación de
incremento o decremento”
también existen operadores para los punteros, sin embargo estos solo aplican
para aquellos apuntadores a matrices, arreglos o listas de elementos, y aunque se
muestran a continuación, se explicaran de una mejor forma en el material de
apuntadores o punteros en c++
OPERADORES RELACIONALES
“Los operadores relacionales, también denominados operadores binarios lógicos
y de comparación, se utilizan para comprobar la veracidad o falsedad de
determinadas propuestas de relación (en realidad se trata respuestas a
preguntas). Las expresiones que los contienen se denominan expresiones
relacionales. Aceptan diversos tipos de argumentos, y el resultado, que es la
respuesta a la pregunta, es siempre del tipo cierto/falso, es decir, producen un
resultado booleano.
Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa
será false (cero). C++ dispone de los siguientes operadores relacionales:
OPERADORES LÓGICOS
“Los operadores lógicos producen un resultado booleano, y sus operandos
son también valores lógicos o asimilables a ellos (los valores numéricos son
asimilados a cierto o falso según su valor sea cero o distinto de cero). Por el
contrario, las operaciones entre bits producen valores arbitrarios. Los operadores
lógicos son tres, dos de ellos son binarios y el último (negación) es unario:
Si el resultado del operando izquierdo es cierto, se continúa con la evaluación de
la expresión de la derecha, que también es convertida a bool. Si el nuevo
resultado es true, entonces el resultado del operador es true. En caso contrario
el resultado es false.
OPERADORES DE BITS
“Los operadores de movimiento son operadores a nivel de bits, y lo que hacen es
convertir una determinada cantidad a su equivalente en bits para posteriormente
realizar un desplazamiento de dicho valor. Estos operadores son:
OPERADORES DE DIRECCIÓN
Además de los operadores aritméticos, de los que existen versiones para los
tipos numéricos y para los punteros, C++ dispone de dos operadores
específicos para estos últimos (punteros de cualquier tipo): la indirección “*” y la
referencia “&” . Además existen dos operadores específicos para punteros-a-
clases
la clase cmath
Palabras clave
Sentencias de selección
La sentencia if
if (expresión booleana)
{
<sentencias>
}
else
{
<sentencias>
}
Ejercicio de clases
Implemente un programa en C++ que rellene un arreglounidimensional de 20 elementos y que escriba el contenido de losíndice impares y posteriormente los contenido del los índices pares
Entrada y salida estandar
#include <iostream> incluye definiciones y declaraciones para lasclases que definen E/S en C++ (iostream, istream y ostream)
#include <stdio.h> contiene las definiciones y declaraciones para lafunción estándar de E/S de C
Salida estándar
#include <iostream>
/* comentario1 */
// comentario2
using namespace std;
Void main()
{
count <<“hola mundo "\n“;
}
Salida con formato
Entrada estándar
#include <iostream>
/* comentario1 */
// comentario2
using namespace std;
Void main()
{ int cantidad
cin>>cantidad;
}
Operador de resolución del ámbito (::)
Permite acceder a una variable global cuya visibilidad ha sido ocultada por una variable global, también esusada para indicar a que clase pertenece una determinada función miembro
Ejemplo estructuras repetitivas
Do-while
for
SOBRECARGA DE FUNCIONES
Otro ejemplo
Primer practica c++
3.2 Declaración de clases y subclases
Definición de clases en C++
Ejemplo
Complex
-int real
-int img
+Complex()
+Read(…)
+Write()
+suma()
Agenda versión Windows y dev c++
Ejemplo 2
Ejercicio de clase
Implemente un programa de vectores, dicho vector tendrá 4componentes, use paradigma orientado a objetos y como lenguajec++, y sus métodos serán los siguientes:
Lectura del vectorEscritura de un vectorNorma de un vectorMultiplicación del vector por un escalar
Destructores
Constructores
Es normal que una parte de un objeto necesite una inicialización antes de poder usarse.Un constructor no es más que una función miembro de la clase que aglutinará unconjunto de instrucciones que permiten inicializar memoria asociada a los objetos de laclase. Normalmente se utilizan para iniciar el objeto cuando éste se crea. Suscaracterísticas son:
Tiene en mismo nombre que la clase. Puede definirse inline o fuera de la declaración de la clase. Pueden aceptar parámetros, los cuales puede definirse con valores por defecto. ƒ Puede estar sobrecargado. Se puede declarar más de un constructor para una misma
clase si todos ellos tienen diferente lista de argumentos. Esto es útil si se quiere iniciar los objetos de varias formas diferentes.
No devuelven valores. No se puede especificar un valor de retorno cuando se declara un constructor, ni siquiera void. En consecuencia, un constructor no puede tener ninguna sentencia return.
El constructor se ejecuta automáticamente cuando se crea un objeto de tipo clase. No se invoca nunca de forma explícita.
ƒEl constructor se suele declarar en la sección pública. Si se hiciera en la sección privada sólo podría ser utilizado por los objetos que se creasen en las funciones miembro y en las funciones amigas
Se denomina constructor por defecto de la clase al constructor que no tiene argumentos.No es obligatorio definir constructores cuando se define una clase, pero es una buenatécnica de programación hacerlo. Si no se define ninguno, el compilador de formaautomática genera un constructor que no tiene ningún parámetro, un constructor pordefecto, que no hace nada, no inicia los datos miembro.
Destructores
Los destructores son funciones miembro especiales que sirven para eliminar un objeto deuna determinada clase. El destructor realizará procesos necesarios cuando un objetotermine su ámbito temporal, por ejemplo liberando la memoria dinámica utilizada por dichoobjeto o liberando recursos usados, como ficheros, dispositivos, etc.Al igual que los constructores, los destructores también tienen algunas característicasespeciales:
También tienen el mismo nombre que la clase a la que pertenecen, pero tienen el símbolo ˜ delante.
No tienen tipo de retorno, y por lo tanto no retornan ningún valor. No tienen parámetros. No pueden ser heredados. Deben ser públicos, no tendría ningún sentido declarar un destructor como privado, ya
que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado.
No pueden ser sobrecargados, lo cual es lógico, puesto que no tienen valor de retorno ni parámetros, no hay posibilidad de sobrecarga.
Constructores sobrecargados
3.3 Declaración de herencia e interfaces
Interface
Concepto de herencia Jerarquía de clases
La jerarquía de clases conectadas mediante relaciones de herencia formaestructuras de apariencia arborescente. Una clase puede heredar datos yfunciones miembros de una o más clases base, aquí sólo consideraremos laherencia simple (heredar de una única clase base) y no la múltiple.
La relación de herencia entre clases puede ser: pública (public), privada (private) óprotegida (protected). La relación que se utiliza con mayor frecuencia es la pública.Dependiendo del número de clases y de cómo se relacionen, la herencia puede ser: a)Simple. b) Múltiple.
Tipos de Herencia.
Cuando sólo se tiene una clase base de la cual hereda la clase derivada, se dice quehay herencia simple(figura a). Sin embargo, la herencia simple no excluye laposibilidad de que de una misma clase base se pueda derivar más de una subclase oclase derivada (figura b)
Herencia Simple.
Person
a
-nombre
-dirección
-ciudad
+leer()
+visualizar()
Paciente
-id
-tel
-fecha_nac;
+leer_paciente()
+visualizar_paciente()
+enviar_fact()
Empleado
-id
-horas_extra
-tel
+leer_empleado()
+visualizar_emplea
do()
+enviar _sal();
Proveedor
-cod_vendedor
-saldo
-fax
-tel
-descuento
+leer_provedor()
+visualizar_provedor()
+pagar_fact()
Persona
-nombre
-dirección
-ciudad
+leer()
+visualizar()
Empleado
-id
-horas_extra
-tel
+leer_empleado()
+visualizar_emplea
do()
+enviar _sal();
Figura a) Figura b)
Ejemplo
Examen
2) Construir una clase Factura que descienda de la clase Precio y que incluya dosatributos específicos llamados emisor y cliente y, al menos, un método llamadoimprimirFactura.
1)
3) Escribe un programa para una biblioteca que contenga libros y revistas.
4) Ejemplo de una jerarquía de herencia de distintos tipos de cuenta
Cuenta
Cuenta corrienteCuenta ahorros
Cuenta ahorradores Estudiante
En el tipo de herencia múltiple se usan dos o más clases base paraderivar una clase. Es decir, la clase derivada comparte los atributos ylos métodos de más de una clase (Figura c).
Herencia Múltiple.
Nota: Java no permite herencia múltiple que ocurre cuando
una clase se deriva de dos o más clases en C++ esto si es
valido
Figura
Círculo Triángulo Cuadrado
es un
Ejercicio de clases(herencia simple)
+ lado+Int l1,l2,l3,b,h+int r;
-Circulo()-Area()-Perimetro()
-Triangulo()-Area()-Perímetro()
-Cuadrado()-Area()-Perimetro()
+String nombre+String color
-Figura ()-write()
Java
Paciente_empleado
…………………..
……………………..
Persona
-nombre
-dirección
-ciudad
+leer()
+visualizar()
Paciente
-id
-tel
-fecha_nac;
+leer_paciente()
+visualizar_paciente()
+enviar_fact()
Empleado
-id
-horas_extra
-tel
+leer_empleado()
+visualizar_empleado()
+enviar _sal();
Proveedor
-cod_vendedor
-saldo
-fax
-tel
-descuento
+leer_provedor()
+visualizar_provedor()
+pagar_fact()
Java
C++
Figura c)
Concepto de modularidad
Programa Persona_empleado
Ejemplo 1
Ejercicio 1
Ejercicio 2
3.4 Relaciones entre clases
3.5 Clases y métodos genéricos
Métodos inlineComo cualquier otra función en C++, las funciones miembro pueden ser inline. Hay
dos formas para hacer que una función miembro sea inline.
La declaración de una función en línea es una solicitud al compilador. Si el
compilador considera que la función es demasiado complicada, bien por su tamaño
o por contar con una estructura compleja, la tratará como si fuera una función
ordinaria. Estas funciones alcanzan su mayor funcionalidad y sentido cuando se
trata de funciones muy cortas.
Sólo se puede utilizar una función en línea en el archivo en que está definida. La
razón es que el compilador necesita la definición completa de la función para poder
insertar el cuerpo de la misma siempre que se llame. Por este motivo si se utiliza unfichero cabecera para declarar una clase, y dicha clase contiene funciones miembroinline, éstas deben definirse en el mismo archivo cabecera.
Ejemplo de función inline
Funciones miembro que retornan una referencia.
En ocasiones se pueden ver clases en C++ que declaran funciones miembro que
retornan referencias a miembros dato privados, por lo que los están convirtiendo en
públicos. Esto se considera una mala técnica de programación porque viola el
encapsulamiento
Objetos y funciones miembro constantes
De la misma manera que se utiliza la palabra reservada const cuando se declara una
variable, se puede usar para la declaración de un objeto. Tal declaración significa que el
objeto es una constante y ninguno de los datos miembro podrá ser modificado. Por
ejemplo:const Fecha nacimiento(9, 7, 1971);
La declaración anterior significa que los atributos del objeto nacimiento de la clase
Fecha no pueden ser modificados.
Miembros estáticos
Atributos estáticos
Cada vez que se define un objeto a partir de una clase concreta los elementos de
datos se duplican. Es decir, los atributos de diferentes instancias de objetos de la
misma clase son independientes y ocupan posiciones diferentes de memoria. Si se
desea que todos los objetos instanciados de una clase compartan una sola copia de
un atributo, se puede definir el atributo como static. Esto se puede utilizar como una
forma de comunicación entre los objetos.
Se puede declarar private, y sólo podrán acceder a él las funciones miembro, o
public con lo que será accesible al resto del programa.
Un ejemplo de un miembro estático privado puede ser:class Cuenta {
char nombre[50];
float total;
static float incremento;
public:
Cuenta ();
void Interes() { total += incremento*total;}
};
En el ejemplo anterior sólo existe una copia de incremento, y es accesible por
todas las instancias de la clase Cuenta. Cada vez que se llame al método Interes
por cualquier objeto de la clase Cuenta, se empleará el mismo valor de
incremento, compartido por todas las instancias. La siguiente figura ilustra este
ejemplo
suponiendo que se han definido tres objetos. Se observa como incremento es un
miembro común a los tres objetos.
Por ejemplo, si incremento fuera un miembro público, se podría acceder a él de la
siguiente manera:// Si incremento fuera públicovoid main () {
Cuenta::incremento=0.000154;}
Métodos estáticos
Si se tienen funciones miembro que sólo acceden a datos miembro estáticos de
una clase, se pueden declarar éstas como static también. Como ejemplo se va a
modificar la clase cuenta que se introdujo en el apartado anterior.class Cuenta {
char nombre[50];
float total;
static float incremento;
public:
Cuenta ();
void Interes() { total += incremento*total;}
static void ActualizaIncremento( float valor)
{incremento=valor;}
};
Las funciones miembro estáticas se llaman con la misma sintaxis que se usa para
acceder a los datos miembro estáticos, es decir es utilizando directamente el
nombre de la clase:void main (void) {
Cuenta micuenta;
Cuenta::ActualizaIncremento (0.016);
micuenta.ActualizaIncremento (0.016);
}
Una función miembro, estática o no, puede manejar variables globales. En el
siguiente ejemplo se muestra el manejo desde una función miembro estática.
Matrices de objetos
Se pueden declarar matrices de objetos de la misma manera que se declaran
de cualquier otro tipo de datos.
Sólo se han iniciado explícitamente los elementos 0 y 1 de colonia. Para el resto se
habrá utilizado el constructor por defecto para la clase Hormiga
Ejemplo:Hormiga colonia[10] = { Hormiga(4,1), Hormiga(6,1) };
Si la clase tiene un constructor con un solo parámetro, se puede especificar el
argumento como valor inicial de un elemento. Se pueden mezclar diferentes
estilos de iniciación.
Object Array (1)
Object Array(2)
Introducción a las plantillas
Los tipos genéricos o parametrizados, también llamados plantillas,permiten construir una familia de clases relacionadas, diferenciándose entresí en el tipo de los datos que manipulan; esto es, son un mecanismo de C++que. permite que un tipo pueda ser utilizado como parámetro en ladefinición de una clase
En lugar de desarrollar, por ejemplo, una clase PilaEnt para enteros yotra PilaLong para enteros largos, podemos desarrollar una clase genérica oplantilla, Pila, que sirva para esos y otros casos, en el fichero Stack.h:
La palabra clave template
C++ utiliza una palabra clave específica template para declarar y definirfunciones y clases genéricas. En estos casos actúa como unespecificador de tipo y va unido al par de ángulos < > que delimitan losargumentos de la plantilla:
template void fun(T& ref); // función genérica
template class C {/*...*/}; // clase genérica
Funciones genéricas
Solución:
#define min(a,b)(((a)<(b)) ?(a):(b))
Double x=26.4, y 26.1
Cout <<min(x,y)<<endl;Int min(int a, int b)
{
return(a<b)?a:b
}
Para ilustrarlo veremos la clase mVector. Los objetos mVector son matrices cuyos elementos son objetos de la clase Vector; que a su vez representan vectores de un espacio de dos dimensiones.
Definición de una clase genérica
La definición de una clase genérica tiene el siguiente aspecto:
template class nombreClase { ... };
Una clase genérica puede tener una declaración adelantada (forward) para ser declarada después:
Observe que aparte del cambio de la declaración, se han sustituido las ocurrencias de Vector (un tipo concreto) por el parámetro T. Observe también la definición de mostrar() que se realiza off-line con la sintaxis de una función genérica. Recordemos que en estas expresiones, el especificador class puede ser sustituido por typename , de forma que la primera línea puede ser sustituida por:
Ejercicio o practica
Los compiladores necesitan que la plantilla completa -declaración de la clase y definiciones de los
métodos- se encuentre en un único fichero .h -sin .cpp-.La definición de la clase va precedida de la especificación de plantilla:
template<class Tipo> class Stack {
...
}
La implementación de una función miembro fuera de la clase debe ir precedida de la especificación de
plantilla y el nombre de la función debe ir cualificado con el nombre genérico de la clase -el nombre
seguido del tipo genérico entre ángulos-:template<class Tipo>
void Stack<Tipo>::push(Tipo dato) {
...
}
Una vez creada la clase genérica, podemos crear un ejemplar concreto indicando entre ángulos el tipo
particular que se desea que utilice la clase:Stack<int> pila1;
Stack<long int> pila2;
Stack<Persona> pila3;
Las plantillas también pueden tener definidos parámetros que no sean tipos, sino valores. Por ejemplo, para
crear una clase Lista genérica puede ser necesario indicar el tamaño deseado. También en la definición dedicha lista genérica se pueden indicar valores por defecto. Así, nuestro fichero Lista.h sería:
Métodos genéricos
Hemos señalado que, por su propia naturaleza, los métodos de clasesgenéricas son a su vez (implícitamente) funciones genéricas con losmismos parámetros que la clase, pero pueden ser además funcionesgenéricas explícitas (que dependan de parámetros distintos de laplantilla a que pertenecen):
Según es usual, la definición del miembro genérico puede efectuarse de dos formas, inline u off-line:
Crear e implementar un programa que cree un arreglo de 3 objetos (complejos) y realice las operaciones suma y resta
Trabajo de clase
super
1. Invoca a un método de la superclase
2. Invoca a un constructor de la superclase
Solo puede aparecer como primera
sentencia de otro constructor
super
El Objeto this
Permite acceder al objeto actual cuyo comportamiento se está definiendo. Es un apuntador a
una clase usado dentro de cualquier método de dicha clase
Caso 1 de this
Caso 2 de this
Bibliografía
• http://www.grch.com.ar/docs/unlu.poo/Clases-objetos%20C++.pdf• http://www.udb.edu.sv/udb/archivo/guia/informatica-ingenieria/programacion-
ii/2013/i/guia-9.pdf• http://burningbytecodes.blogspot.com/2014/08/c-poo-plantillas-y-excepciones.html• http://www.elai.upm.es/moodle/pluginfile.php/2298/mod_resource/content/1/Tema
6_libroC%2B%2B2013.pdf