1. ESCUELA POLITÉCNICA DEL
EJERCITO
PROGRAMACION
ORIENTADA DE OBJETOS
Ing. José Luis Carrillo Medina
Facultad de Sistemas e Informática
ESCUELA POLITÉCNICA DEL EJERCITO
Febrero , 200 2
2. OBJETIVOS
Conocer los conceptos básicos de
los programas orientados a objetos
(POO).
Conocer herramientas de
desarrollo de POO: Turbo C++,
Visual C++.
Implementar programas para
Windows en C++ utilizando
Microsoft Foundation Class Library
6.0 (MFC).
3. CONOCIMIENTOS PREVIOS
A personas que quieren programar
para Windows y quieren hacerlo en
C++
Saber como programar sea C o C+
+, Visual Basic, Pascal, o cualquier
otro lenguaje de programación.
4. CONTENIDO
Lenguaje de Programación
Orientado a Objetos: C++
Turbo C++ 3.0
Visual C++ 6.0
Microsoft Foundation Class
Library 6.0
Bibliografía
5. BIBLIOGRAFÍA
Herbert Schildt. Turbo C++, Mc Graw Hill, España,
1996.
Herbert Schildt. C++ Guia de la Autoenseñanza, Mc
Graw Hill, España, 1996.
Jon Bates & Tim Tompkins. Descubre Microsoft
Visual C++, Prentice Hall, España, 1999
Chuck Sphar. Aprenda Microsoft Visual C++ 6.0 Ya. Mc
Graw Hill, España, 1999.
Jose Luis Carrillo M, Programación Orientada a
Objetos: Curso C++, Mayo 2004
6. Curso de C++
Proceso para la obtención de un programa
ejecutable
Probablemente este es el lugar más adecuado
para explicar cómo se obtiene un fichero
ejecutable a partir de un programa C++.
Para empezar necesitamos un poco de
vocabulario técnico. Veremos algunos conceptos
que se manejan frecuentemente en cualquier
curso de programación y sobre todo en manuales
de C y C++.
7. Curso de C++
Fichero fuente y programa o código fuente:
Los programas C y C++ se escriben con la ayuda
de un editor de textos del mismo modo que
cualquier texto corriente. Los ficheros que
contiene programas en C o C++ en forma de
texto se conocen como ficheros fuente, y el texto
del programa que contiene se conoce como
programa fuente. Nosotros siempre escribiremos
programas fuente y los guardaremos en ficheros
fuente.
8. Curso de C++
Ficheros objeto, código objeto y compiladores:
Los programas fuente no pueden ejecutarse. Son
ficheros de texto, pensados para que los
comprendan los seres humanos, pero
incomprensibles para los ordenadores.
Para conseguir un programa ejecutable hay que
seguir algunos pasos. El primero es compilar o
traducir el programa fuente a su código objeto
equivalente. Este es el trabajo que hacen los
compiladores de C y C++. Consiste en obtener un
fichero equivalente a nuestro programa fuente
9. Curso de C++
comprensible para el ordenador, este fichero se
conoce como fichero objeto, y su contenido como
código objeto.
Los compiladores son programas que leen un
fichero de texto que contiene el programa fuente
y generan un fichero que contiene el código
objeto.
El código objeto no tiene ningún significado para
los seres humanos, al menos no directamente.
Además es diferente para cada ordenador y para
cada sistema operativo. Por lo tanto existen
diferentes compiladores para diferentes sistemas
operativos y para cada tipo de ordenador.
10. Curso de C++
Librerías:
Junto con los compiladores de C y C++, se
incluyen ciertos ficheros llamados librerías. Las
librerías contienen el código objeto de muchos
programas que permiten hacer cosas comunes,
como leer el teclado, escribir en la pantalla,
manejar números, realizar funciones matemáticas,
etc. Las librerías están clasificadas por el tipo de
trabajos que hacen, hay librerías de entrada y
salida, matemáticas, de manejo de memoria, de
manejo de textos, etc.
11. Curso de C++
Hay un conjunto de librerías muy especiales, que
se incluyen con todos los compiladores de C y de
C++. Son las librerías ANSI o estándar. Pero
también hay librerías no estándar, y dentro de
estas las hay públicas y comerciales. En este
curso sólo usaremos librerías ANSI.
Ficheros ejecutables y enlazadores:
Cuando obtenemos el fichero objeto, aún no
hemos terminado el proceso. El fichero objeto, a
pesar de ser comprensible para el ordenador, no
puede ser ejecutado. Hay varias razones para
eso:
12. Curso de C++
1. Nuestros programas usaran, en general,
funciones que estarán incluidas en librerías
externas, ya sean ANSI o no. Es necesario
combinar nuestro fichero objeto con esas
librerías para obtener un ejecutable.
2. Muy a menudo, nuestros programas estarán
compuestos por varios ficheros fuente, y de cada
uno de ellos se obtendrá un fichero objeto. Es
necesario unir todos los ficheros objeto, más las
librerías en un único fichero ejecutable.
13. Curso de C++
3. Hay que dar ciertas instrucciones al
ordenador para que cargue en memoria el
programa y los datos, y para que organice la
memoria de modo que se disponga de una pila
de tamaño adecuado, etc. La pila es una zona de
memoria que se usa para que el programa
intercambie datos con otros programas o con
otras partes del propio programa. Veremos esto
con más detalle durante el curso.
Existe un programa que hace todas estas cosas,
se trata del "link", o enlazador. El enlazador
toma
14. Curso de C++
todos los ficheros objeto que componen nuestro
programa, los combina con los ficheros de
librería que sea necesario y crea un fichero
ejecutable.
Una vez terminada la fase de enlazado, ya
podremos ejecutar nuestro programa.
Errores:
Por supuesto, somos humanos, y por lo tanto nos
equivocamos. Los errores de programación
pueden clasificarse en varios tipos, dependiendo
de la fase en que se presenten.
15. Curso de C++
Errores de sintaxis: son errores en el programa
fuente. Pueden deberse a palabras reservadas
mal escritas, expresiones erróneas o
incompletas, variables que no existen, etc. Los
errores de sintaxis se detectan en la fase de
compilación. El compilador, además de generar
el código objeto, nos dará una lista de errores de
sintaxis. De hecho nos dará sólo una cosa o la
otra, ya que si hay errores no es posible generar
un código objeto.
16. Curso de C++
Avisos: además de errores, el compilador puede
dar también avisos (warnings). Los avisos son
errores, pero no lo suficientemente graves como
para impedir la generación del código objeto. No
obstante, es importante corregir estos avisos, ya
que el compilador tiene que decidir entre varias
opciones, y sus decisiones no tienen por qué
coincidir con lo que nosotros pretendemos, se
basan en las directivas que los creadores del
compilador decidieron durante su creación.
17. Curso de C++
Errores de enlazado: el programa enlazador
también puede encontrar errores. Normalmente
se refieren a funciones que no están definidas en
ninguno de los ficheros objetos ni en las
librerías. Puede que hayamos olvidado incluir
alguna librería, o algún fichero objeto, o puede
que hayamos olvidado definir alguna función o
variable, o lo hayamos hecho mal.
Errores de ejecución: incluso después de
obtener un fichero ejecutable, es posible que se
produzcan errores.
18. Curso de C++
En el caso de los errores de ejecución
normalmente no obtendremos mensajes de error,
sino que simplemente el programa terminará
bruscamente. Estos errores son más difíciles de
detectar y corregir. Existen programas auxiliares
para buscar estos errores, son los llamados
depuradores (debuggers). Estos programas
permiten detener la ejecución de nuestros
programas, inspeccionar variables y ejecutar
nuestro programa paso a paso. Esto resulta útil
para detectar excepciones, errores sutiles, y
fallos que se presentan dependiendo de
circunstancias distintas.
19. Curso de C++
Errores de diseño: finalmente los errores más
difíciles de corregir y prevenir. Si nos hemos
equivocado al diseñar nuestro algoritmo, no
habrá ningún programa que nos pueda ayudar a
corregir los nuestros. Contra estos errores sólo
cabe practicar y pensar.
20. Curso de C++
¿Qué clase de programas y aplicaciones se
pueden crear usando C y C++?
La respuesta es muy sencilla: TODOS.
Tanto C como C++ son lenguajes de
programación de propósito general. Todo puede
programarse con ellos, desde sistemas
operativos y compiladores hasta aplicaciones de
bases de datos y procesadores de texto,
pasando por juegos, aplicaciones a medida, etc.
21. Curso de C++
Oirás y leerás mucho sobre este tema. Sobre
todo diciendo que estos lenguajes son
complicados y que requieren páginas y páginas
de código para hacer cosas que con otros
lenguajes se hacen con pocas líneas. Esto es
una verdad a medias. Es cierto que un listado
completo de un programa en C o C++ para
gestión de bases de datos (por poner un
ejemplo) puede requerir varios miles de líneas de
código, y que su equivalente en Visual Basic sólo
requiere unos pocos cientos. Pero detrás de
cada línea de estos compiladores de alto nivel
hay
22. Curso de C++
cientos de líneas de código en C, la mayor parte
de estos compiladores están respaldados por
enormes librerías escritas en C. Nada te impide
a ti, como programador, usar librerías, e incluso
crear las tuyas propias.
Una de las propiedades de C y C++ es la
reutilización del código en forma de librerías de
usuario. Después de un tiempo trabajando, todos
los programadores desarrollan sus propias
librerías para aquellas cosas que hacen
frecuentemente. Y además, raramente piensan
en ello, se limitan a usarlas.
23. Curso de C++
Además, los programas escritos en C o C++
tienen otras ventajas sobre el resto. Con la
excepción del ensamblador, generan los
programas más compactos y rápidos. El código
es transportable, es decir, un programa ANSI en
C o C++ podrá ejecutarse en cualquier máquina y
bajo cualquier sistema operativo. Y si es
necesario, proporcionan un acceso a bajo nivel
de hardware sólo igualado por el ensamblador.
24. Curso de C++
Otra ventaja importante, C tiene más de 30 años
de vida, y C++ casi 20 y no parece que su uso se
debilite demasiado. No se trata de un lenguaje
de moda, y probablemente a ambos les quede
aún mucha vida por delante. Sólo hay que pensar
que sistemas operativos como Linux, Unix o
incluso Windows se escriben casi por completo
en C.
25. Curso de C++
Por último, existen varios compiladores de C y
C++ gratuitos, o bajo la norma GNU, así como
cientos de librerías de todo propósito y miles de
programadores en todo el mundo, muchos de
ellos dispuestos a compartir su experiencia y
conocimientos.
26. Curso de C++
TIPOS DE DATOS EN C++
TIPO NOMBRE RANGO DE VALORES
Char -128..127
Int -32768..32767
ENTEROS
-
Long int
2.147.438.648..2.147.483.647
float +/-1E-37..+/-1E38
REALES double +/-1E-307..+/-1E308
Long double +/-1E-4932..+/-1E4932
CARACTER Char CÓDIGO ASCII
VACÍO Void -
27. Curso de C++
TIPOS ENUMERADOS
Un tipo enumerado o enumeración está construido
por una serie de constantes simbólicas enteras. El
ejemplo asocia falso a cero y verdadero a 1.
enum {falso, verdadero}; // falso =0, verdadero =1
Esta asignación se puede cambiar:
enum {lunes=1,martes, miércoles};
//lunes=1, martes=2, miércoles=3
enum {lunes=10,martes=20,miércoles=30}
enum dias {lunes, martes, miércoles };
28. Curso de C++
INTRODUCCIÓN A LOS LENGUAJES
ORIENTADOS A OBJETOS
La Programación Orientada a Objetos (POO) es
una nueva forma de programación que se utiliza
para desarrollar programas más eficientes y con
gran fiabilidad.
Para ello quizá sea necesario dejar a un lado las
ideas de la programación tradicional, en la que los
datos se tratan separadamente de los
procedimientos que actúan como una “caja
negra”, y adentrarse en aquellas orientadas a
objetos, en la que los programas se dividen en
“entidades”
29. Curso de C++
INTRODUCCIÓN A LOS LENGUAJES
ORIENTADOS A OBJETOS
independientes conocidas como objetos, que
contienen datos y procedimientos que actúan
sobre esos datos. Dichos objetos se comunican
entre sí por medio de “métodos” a través de
“mensajes” que son acciones que debe ejecutar
el objeto.
Objetos físicos (un automóvil, un avión),
elementos de interfaces gráficas de usuario
(ventanas, botones, íconos), estructuras de datos
(arrays, pilas, colas), tipos de datos definidos por
el usuario (números complejos, puntos de un
plano), etc.
30. Curso de C++
EVOLUCION DE LOS LENGUAJES
ORIENTADOS A OBJETOS
Lenguaje ensamblador: en los primeros
computadores la programación se realizaba con
instrucciones de “lenguaje de máquina” en código
binario; al aumentar la complejidad de los
programas se creó un traductor llamado
“ensamblador” que convertía a lenguaje de
máquina.
Lenguaje de alto nivel: con ellos se pudieron
resolver problemas un poco más complejos, pero
con ellos se dificulta la creación de programas
más grandes y elaborados.
31. Curso de C++
EVOLUCION DE LOS LENGUAJES
ORIENTADOS A OBJETOS
Lenguaje de procedimientos: el modelo utilizado
en estos lenguajes es la “caja negra”, donde cada
parte de un programa se cambia completamente
por una caja negra o procedimiento. Tales
procedimientos tienen más importancia que los
datos; mientras que ciertos datos se introducen,
otros salen de él. Estos lenguajes se utilizan para
proyectos limitados, pero aparecen dificultades a
medida que aumenta la complejidad en los
programas.
32. Curso de C++
EVOLUCION DE LOS LENGUAJES
ORIENTADOS A OBJETOS
Lenguaje estructurado: estos lenguajes tienen las
siguientes características: fácil lectura, fácil
modificación y fácil detección de errores; de esta
manera se salvaron los programas de “lenguaje
de procedimiento” para su empleo en grandes
proyectos. Sin embargo, en este tipo de lenguaje,
se necesita gran prudencia y planificación para
que un proyecto se ensamble correctamente, sin
errores y sea fácil de mantener, pero esta técnica
de programación no puede ser utilizada cuando
un proyecto alcanza cierto tamaño y complejidad.
33. Curso de C++
EVOLUCION DE LOS LENGUAJES
ORIENTADOS A OBJETOS
Lenguaje orientado a objetos: estos lenguajes
tienen un nuevo medio de organizar código y
datos para realizar un control creciente de la
complejidad del proceso de desarrollo del
software, ya que las propiedades fundamentales
de la POO son: herencia, encapsulación y
polimorfismo, junto con los conceptos de:
objetos, clases, métodos y mensajes.
34. Curso de C++
VENTAJAS Y DESVENTAJAS DE LOS
LENGUAJES ORIENTADOS A OBJETOS.
Ventajas.
Un lenguaje de programación que soporta POO
beneficia el desarrollo de software de programas
extensos y sofisticados, ya que ofrece una forma
más natural de desarrollo de modelos utilizando
clases.
Un lenguaje con POO tiene menos líneas de
código, menos sentencias de bifurcación, y
módulos que son más comprensibles porque
reflejan de una forma más clara la relación
existente entre cada concepto a desarrollar.
35. Curso de C++
VENTAJAS Y DESVENTAJAS DE LOS
LENGUAJES ORIENTADOS A OBJETOS.
Ventajas.
La herencia, que es una característica exclusiva
de la POO, es una de las claves más importantes
para la reutilización de código, que a su vez
reduce el código de programación, y para la
creación de programas extensibles.
En la POO no se necesita examinar todo el
código fuente para ver si un cambio local afecta a
otras partes, porque se utiliza el concepto de
“encapsulamiento” de los objetos.
36. Curso de C++
VENTAJAS Y DESVENTAJAS DE LOS
LENGUAJES ORIENTADOS A OBJETOS.
Desventajas.
Obliga a usuario a conocer una amplia librería de
clases antes de empezar a manipular un lenguaje
orientado a objetos.
La ejecución de un programa orientado a objetos
es más lenta, porque se aprovecha todos los
recursos de la plataforma utilizada para el
desarrollo de dicho programa.
37. Curso de C++
CARACTERÍSTICAS DE LA PROGRAMACIÓN
ORIENTADA A OBJETOS
Los objetos son paquetes compactos que no se
rompen al añadir otros objetos, por lo que si
existen errores en el nuevo objeto estos serán
aislados del resto del programa.
Un lenguaje orientado a objetos soporta datos
abstractos (clases), herencia y polimorfismo.
Mediante la herencia los objetos pueden adquirir
las propiedades de otros objetos ya existentes y
añadir sus propias características.
38. Curso de C++
CARACTERÍSTICAS DE LA PROGRAMACIÓN
ORIENTADA A OBJETOS
La abstracción y ocultación de datos reduce la
dependencia de los módulos.
Los datos internos que definen el estado actual
del objeto y los métodos que definen su
comportamiento están encapsulados.
Los objetos pueden comunicarse entre sí por
medio de mensajes a través de sus métodos.
39. Curso de C++
LOS LENGUAJES DE PROGRAMACIÓN
ORIENTADOS A OBJETOS
Los lenguajes de programación orientados a
objetos se dividen en puros e híbridos.
Los lenguajes de programación orientados a
objetos puros son aquellos que tienen las
orientadas a objetos como: Smalltalk y Eiffel.
Los lenguajes de programación orientados a
objetos híbridos son aquellos que añaden las
propiedades de orientación a objetos a las
propiedades intrínsecas de tipo procedimental
como C++ y Objective C.
40. Curso de C++
P rogramacion O rientada a O bjetos :
Siglas de Programación Orientada a Objetos
”POO ". En inglés se pone al revés "OOP". La
idea básica de este tipo de programación es
agrupar los datos y los procedimientos para
manejarlos en una única entidad: el objeto. Un
programa es un objeto, que a su vez está
formado de objetos. La idea de la programación
estructurada no ha desaparecido, de hecho se
refuerza y resulta más evidente, como
comprobarás cuando veamos conceptos como la
herencia.
41. Curso de C++
Objeto:
Un objeto es una unidad que engloba en sí
mismo datos y procedimientos necesarios para el
tratamiento de esos datos. Hasta ahora
habíamos hecho programas en los que los datos
y las funciones estaban perfectamente
separadas, cuando se programa con objetos esto
no es así, cada objeto contiene datos y
funciones. Y un programa se construye como un
conjunto de objetos, o incluso como un único
objeto.
42. Curso de C++
Mensaje:
El mensaje es el modo en que se comunican los
objetos entre si. En C++, un mensaje no es más
que una llamada a una función de un
determinado objeto. Cuando llamemos a una
función de un objeto, muy a menudo diremos que
estamos enviando un mensaje a ese objeto.
En este sentido, mensaje es el término adecuado
cuando hablamos de programación orientada a
objetos en general.
43. Curso de C++
Método:
Se trata de otro concepto de POO, los mensajes
que lleguen a un objeto se procesarán
ejecutando un determinado método. En C++ un
método no es otra cosa que una función o
procedimiento perteneciente a un objeto.
44. Curso de C++
Clase:
Una clase se puede considerar como un patrón
para construir objetos. En C++, un objeto es sólo
un tipo de variable de una clase determinada. Es
importante distinguir entre objetos y clases, la
clase es simplemente una declaración, no tiene
asociado ningún objeto, de modo que no puede
recibir mensajes ni procesarlos, esto únicamente
lo hacen los objetos.
45. Curso de C++
Interfaz:
Las clases y por lo tanto también los objetos,
tienen partes públicas y partes privadas. Algunas
veces llamaremos a la parte pública de un objeto
su interfaz. Se trata de la única parte del objeto
que es visible para el resto de los objetos, de
modo que es lo único de lo que se dispone para
comunicarse con ellos.
46. Curso de C++
Encapsulamiento :
E s tener todos los datos lo más privado
posible, y para poder acceder a ellos, sera
necesario acceder a los metodos (funciones)
que proporcione el modulo, limitando el
acceso.
Abstraccion :
Representar la realidad con los detalles
necesarios, sin los no necesarios para el
dominio del problema que hay que
representar.
47. Curso de C++
Polimorfismo.
(Polimorfismo significa “muchas formas”) Es una
característica de la programación orientada a
objetos que permite que un nombre pueda
utilizarse en dos o mas formas, para dos o mas
propósitos relacionados entre si. Esto significa
que el lenguaje C++ puede admitir una
sobrecarga de funciones u operadores de una
misma función.
48. Curso de C++
Herencia:
Veremos que es posible diseñar nuevas clases
basándose en clases ya existentes. En C++ esto
se llama derivación de clases, y en POO herencia.
Cuando se deriva una clase de otra, normalmente
se añadirán nuevos métodos y datos. El conjunto
de datos y métodos que sobreviven, es lo que se
conoce como herencia. La Herencia ayuda a la
reutilización del código cuando se utiliza con el
Polimorfismo y es útil para reutilizar diseños del
programa y crear programas extensibles.
49. Curso de C++
Declaración de una clase
Ahora va a empezar un pequeño bombardeo de
nuevas palabras reservadas de C++, pero no te
asustes, no es tan complicado como parece.
La primera palabra que aparece es lógicamente
class que sirve para declarar una clase. Su uso
es parecido a la ya conocida struct:
class <identificador de clase> [<:lista de clases
base>]
{
<lista de miembros>
} [<lista de objetos>];
50. Curso de C++
La lista de clases base se usa para derivar
clases, de momento no le prestes demasiada
atención, ya que por ahora sólo declararemos
clases base.
La lista de miembros será en general una lista de
funciones y datos.
Los datos se declaran del mismo modo en que lo
hacíamos hasta ahora, salvo que no pueden ser
inicializados, recuerda que estamos hablando de
declaraciones de clases y no de definiciones de
objetos. En el siguiente capítulo veremos el
modo de inicializar las variables de un objeto.
51. Curso de C++
Las funciones pueden ser simplemente
declaraciones de prototipos, que se deben definir
aparte de la clase o también definiciones.
Cuando se definen fuera de la clase se debe
usar el operador de ámbito "::".
Lo veremos mucho mejor con un ejemplo.
Aquí va un Ejemplo:
52. Curso de C++
Especificaciones de acceso:
Dentro de la lista de miembros, cada miembro
puede tener diferentes niveles de acceso.
class <identificador de clase> {
public:
<lista de miembros>
private:
<lista de miembros>
protected:
<lista de miembros>
};
53. Curso de C++
Acceso privado, private:
Los miembros privados de una clase sólo son
accesibles por los propios miembros de la clase
y en general por objetos de la misma clase, pero
no desde funciones externas o desde funciones
de clases derivadas.
Acceso público, public:
Cualquier miembro público de una clase es
accesible desde cualquier parte donde sea
accesible el propio objeto.
Aquí va un Ejemplo:
54. Curso de C++
Constructores
Los constructores son funciones miembro
especiales que sirven para inicializar un objeto
de una determinada clase cuando se declara.
Los constructores tienen el mismo nombre que la
clase, no retornan ningún valor y no pueden ser
heredados. Además deben ser públicos, no
tendría ningún sentido declarar un constructor
como privado, ya que siempre se usan desde el
exterior de la clase, ni tampoco como protegido,
ya que no puede ser heredado.
Aquí va un Ejemplo:
55. Curso de C++
Destructores
Los destructores son funciones miembro
especiales que sirven para eliminar un objeto
de una determinada clase, liberando la
memoria utilizada por dicho objeto.
Los destructores tienen el mismo nombre que
la clase, pero con el símbolo ~ delante, no
retornan ningún valor y no pueden ser
heredados.
Cuando se define un destructor para una
clase, éste es llamado automáticamente
cuando se abandona el ámbito en el que fue
definido.
56. Curso de C++
Esto es así salvo cuando el objeto fue creado
dinámicamente con el operador new, ya que
en ese caso, si es necesario eliminarlo, hay
que usar el operador delete.
En general, será necesario definir un
destructor cuando nuestra clase tenga datos
miembro de tipo puntero, aunque esto no es
una regla estricta. El destructor no puede
sobrecargarse, por la sencilla razón de que no
admite argumentos.
Aquí va un Ejemplo:
57. Curso de C++
Constructores con Parámetros
A menudo, cuando se crea un objeto, es
necesario o deseable inicializar varios elementos
de datos con valores específicos. El concepto de
inicialización de objetos se amplia para permitir
la inicialización de objetos específicos utilizando
valores definidos por el programador.
Aquí va un Ejemplo:
58. Curso de C++
Funciones inline
C++ permite sustituir, en tiempo de compilación,
la llamada a una función por el código
correspondiente en el punto en que se realiza la
llamada. De esta manera la ejecución es más
rápida, pues no se pierde tiempo transfiriendo el
control y realizando conversiones de parámetros.
Como contrapartida, el programa resultante
ocupa más memoria, pues es posible que el
código de una misma función se introduzca
muchas veces, con las repeticiones
consiguientes. Las funciones inline resultan
interesantes en el caso de funciones muy breves,
que aparecen en pocas líneas de código pero
que se ejecutan muchas veces (en un bucle for,
por ejemplo).
59. Curso de C++
Existen dos formas de definirlas:
Una primera forma de utilizar funciones inline es
anteponer dicha palabra en la declaración de la
función,
O tra forma de utilizar funciones inline sin
necesidad de utilizar esta palabra es introducir el
código de la función en la declaración
(convirtiéndose de esta manera en definición),
poniéndolo entre llaves { } a continuación de
ésta.
Aquí va un Ejemplo
60. Curso de C++
Funciones friend
Una función que no es miembro de una clase y
que puede acceder a la parte privada de una
clase se le conoce como una función
amiga(friend) de la clase.
El formato de la declaración de funciones friend
es el siguiente:
class <nombre de la clase>{
public :
friend <declaración de función>
//Datos y funciones miembros
}
61. Curso de C++
Hay otros dos motivos por los que las funciones
amigas son útiles y tienen que ver con la
sobrecarga de operadores y la creación de
ciertos tipos de funciones de E/S.
Otro de los motivos es el de comparar los datos
privados de dos clases como en el ejemplo
siguiente que permite comparar las areas de dos
objetos(triangulo y rectangulo).
Aquí va un Ejemplo
62. Curso de C++
POLIMORFISMO
Otra de las características mas importantes de
un lenguaje orientado a objetos es el
polimorfismo, el cual permite el uso de un
nombre para especificar un nombre de acción
general. De esta manera se ejecuta una parte
específica de la clase general dependiendo del
tipo de dato con el que está tratando. En este
capítulo se presentan las formas de hacer
polimorfismo: Sobrecarga de Funciones y
Sobrecarga de Operadores
63. Curso de C++
Sobrecarga de funciones
Una de las maneras que tiene C++ de llegar al
polimorfismo es a través de la sobrecarga de
funciones . En C++, dos o más funciones pueden
compartir un mismo nombre siempre y cuando
difieran en la declaración de sus parámetros.
Las funciones que comparten el mismo nombre
se dice que están sobrecargadas.
Aquí va un Ejemplo:
64. Curso de C++
Sobrecarga de operadores
Para sobrecargar un operador se debe definir la
operación significa con relación a la clase a la
que se aplica. Para hacer esto, hay que crear
una función operador que defina su acción.
La forma general de declarar una sobrecarga de
operadores es:
tipo_devuelto nombre_clase :: operator # (lista de
argumentos){
// operación que se va ha realizar
}
65. Curso de C++
# - es el operador que se quiere sobrecargar.
tipo es el tipo de valor devuelto por la operación
especificada, es con frecuencia del mismo tipo
que la clase para la cual se ha sobrecargado el
operador.
El objeto causante de una llamada a un operador
sobrecargado siempre es el situado a la
izquierda del operador.
C++ permite sobrecargar los operadores de modo
similar a lo que se hace con las funciones. La
mayoría de operadores de C++ pueden ser
sobrecargados como son: +,-, *, /, =, ==, !=, <<,
>>, etc. Los únicos operadores que no pueden
sobrecargarse son: . :: .* ?
66. Curso de C++
Tampoco pueden sobrecargarse los operadores
del preprocesador (El operador .* es muy
especializado).
En una expresión a + b donde a y b son objetos,
a es el causante de la llamada (pasa su valor a
través de this), mientras que el valor de b es
recibido a través del paso de parámetros.
En general, cuando se usa una función miembro
no se necesitan parámetros al sobrecargar una
operación monaria y solo se necesita un
parámetro cuando se sobrecarga un operador
binario.
Aquí va un Ejemplo:
67. Curso de C++
HERENCIA
Otra de las características de un leguaje de
programación orientada a objetos es la herencia.
La herencia es un proceso por medio del cual un
objeto puede adquirir las propiedades de otro
esto es importante porque permite dar soporte al
concepto de calificación. En este capitulo se
presentan herencia simple, tipos de herencia,
herencia con constructores sin parámetros y
constructores con parámetros, herencia múltiple
68. Curso de C++
Herencia Simple
Las clases que heredan propiedades se llaman
clase derivada, mientras que la clase de la que
se heredan se denomina clase base. En herencia
por lo menos existe una clase llamada clase
base y otra llamada clase heredada.
En nuestro lenguaje formulamos la herencia con
"hereda de". En C++ estas palabras son
reemplazadas por dos puntos ( : ).
Una descripción general de Herencia seria:
69. Curso de C++
class nombre_clase_base{
//datos y funciones miembros propios de la clase
//base
};
Class nombre_clase_derivada : modo_acceso
nombre_clase_base{
//datos y funciones miembros propios de la
//clase heredada
};
Aquí va un Ejemplo
70. Curso de C++
Acceso protegido, protected:
Con respecto a las funciones externas, es
equivalente al acceso privado, pero con respecto
a las clases derivadas se comporta como
público.
Cada una de éstas palabras, seguidas de ":", da
comienzo a una sección, que terminará cuando
se inicie la sección siguiente o cuando termine la
declaración de la clase. Es posible tener varias
secciones de cada tipo dentro de una clase.
Si no se especifica nada, por defecto, los
miembros de una clase son privados.
71. Curso de C++
Tipos de Herencia (modos de acceso)
Es necesario porque C++ distingue dos tipos de
herencia: pública y privada. "Por default", las
clases se derivan unas de otras en forma
privada. Consecuentemente, debemos decirle
explícitamente al compilador que use herencia
pública. modo_acceso:
public: Los datos y funciones miembros public
siguen siendo public, y los private siguen siendo
private en la clase derivada.
private: Los datos y funciones miembros public y
private son todos private en la clase derivada.
72. Curso de C++
Herencia con Constructores sin parámetros.
Es posible que una clase base y una clase
derivada tengan cada una su función de
construcción sin parámetros. Cuando una clase
derivada contiene un constructor, se ejecuta el
constructor base antes de ejecutar el constructor
de la clase derivada.
Cuando existe herencia los constructores de las
clases base se invocan por órden, de izquierda a
derecha y siempre antes que el de la clase
derivada. Mientras que los destructores se
invocan de derecha a izquierda, y siempre
después que el destructor de la clase derivada.
Aquí va un Ejemplo
73. Curso de C++
Herencia con Constructores con parámetros.
Es posible que una clase base y una clase
derivada tengan cada una su función de
construcción con parámetros. Cuando una clase
derivada contiene un constructor, se ejecuta el
constructor base antes de ejecutar el constructor
de la clase derivada.
Si el constructor de la clase base tiene
parámetros la clase derivada debe tener
necesariamente un constructor con parámetros
Aquí va un Ejemplo
74. Curso de C++
Herencia Múltiple
Es posible que una clase herede atributos de dos
o más clases. Para realizar esto, se usa una lista
de herencia, separada por comas, en la lista de
las clases base de la clase derivada.
class nombre_clase_derivada :
lista_de_clases_bases{
datos y funciones miembros de la clase
derivada
};
Aquí va un Ejemplo
75. Curso de C++
CLASES BASES VIRTUALES
Cuando dos o más objetos se derivan de
una clase base común, se puede impedir
que estén presentes múltiples copias de
la clase base en un objeto derivado de
esos objetos, declarando la clase base
como virtual cuando se hereda.
Aquí va un Ejemplo
76. Curso de C++
FUNCIONES VIRTUALES
Una función virtual es una función que se declara
en la clase base como virtual y se redefine en una
o más clases derivadas.
Las funciones virtuales son especiales, porque
cuando se accede a una usando un puntero de la
clase base a un objeto de una clase derivada, C++
determinada en tiempo de ejecución a que función
llamar en función del tipo de objeto apuntado.
Una función virtual se declara como virtual dentro
de la clase base usando la palabra clave virtual.
Sin embargo, cuando se redefine una función
virtual en una clase derivada no se necesita repetir
la palabra clave virtual (aunque no es un error
hacerlo).
Aquí va un Ejemplo
77. Curso de C++H
FUNCIONES VIRTUALES PURAS Y TIPOS
A BSTRACTOS
Una función virtual pura es una función que se
declara en una clase base y que no tiene
definición relativa a la base, por lo que todos los
tipos derivados se ven obligados a definir su
propia versión de esa función.
Para declarar una función virtual pura se utiliza
la forma general:
78. Curso de C++H
virtual tipo nombre_funcion (lista parámetros) =
0; Si una clase tiene por lo menos una función
virtual pura entonces se dice que esa clase es
abstracta. Las clases abstractas tienen una
característica importante no puede haber objetos
de esa clase, porque una o más de sus funciones
carecen de definición.
Nota: Pero si es posible declarar punteros de
una clase abstracta.
Aquí va un Ejemplo
79. Curso de C++H
PLANTILLAS (TEMPLATE)
Las funciones genéricas se crean mediante la
palabra reservada template.
La palabra template se refleja en el uso de C++.
Se utiliza para crear una pantilla que describe lo
que hará una función, dejando al compilador que
complete los detalles necesarios
El formato de una función template es el
siguiente:
template<class tipo> tipo_devuelto
nombre_función(lista_de_parámetros){
//cuerpo de la función
}
80. Curso de C++H
donde tipo es un nombre de marcador para el
tipo de dato que utilizara la función, el nombre
puede ser utilizado dentro de la función no
obstante se trate únicamente de un marcador
que el compilador se encargará de reemplazar
automáticamente por un tipo de dato real cuanto
cree una versión específica de la función.
Aquí va un Ejemplo
81. Curso de C++H
GESTIÓN DE EXCEPCIONES Y ERRORES
Manejo De Excepciones
El control de flujo en un programa C++ puede
hacerse mediante las ya conocidas sentencias
estructuradas (if, while, return).
Mediante las excepciones se podrá evitar repetir
continuamente código, en busca de un posible
error, y avisar a otros objetos de una condición
anormal de ejecución durante un programa.
Mediante la gestión de excepciones se
prescindirá de sentencias de control de errores
del tipo:
if ( error == true )
return ERROR;
82. Curso de C++H
Tipos de Excepciones:
Error: Excepciones que indican problemas muy
graves, que suelen ser no recuperables y no
deben casi nunca ser capturadas.
Exception: Excepciones no definitivas, pero que
se detectan fuera del tiempo de ejecución.
Funcionamiento
Para que el sistema de gestión de excepciones
funcione se ha de trabajar en dos partes de los
programas:
83. Curso de C++H
Definir qué partes de los programas crean una
excepción y bajo qué condiciones. Para ello se
utilizan las palabras reservadas throw y throws.
Comprobar en ciertas partes de los programas si
una excepción se ha producido y actuar en
consecuencia. Para ello se utilizan las palabras
reservadas try, catch y finally.
Manejo de excepciones: try - catch – finally
Cuando el programador va a ejecutar un trozo de
código que pueda provocar una excepción (por
ejemplo, una lectura en un archivo), debe incluir
este fragmento de código dentro de un bloque
try:
84. Curso de C++H
try {
// Código posiblemente problemático
}
Pero lo importante es cómo controlar, qué hacer
con la posible excepción que se cree. Para ello
se utilizan las cláusulas catch, en las que se
especifica que acción realizar:
Aquí va un Ejemplo
85. Curso de C++H
try {
// Código posiblemente problemático
} catch( tipo_de_excepcion e) {
// Código para solucionar la excepción e
} catch( tipo_de_excepcion_mas_general e) {
// Código para solucionar la excepción e
}
Aquí va un Ejemplo
86. Curso de C++H
Ejemplo: Se observa que se pueden anidar
sentencias catch, pero conviene hacerlo
indicando en último lugar las excepciones más
generales (es decir, que se encuentren más
arriba en el árbol de herencia de excepciones),
porque el intérprete C++ ejecutará aquel bloque
de código catch cuyo parámetro sea del tipo de
una excepción lanzada.
Si no se ha lanzado ninguna excepción el código
continúa sin ejecutar ninguna sentencia catch.
87. Curso de C++H
Si quisiéremos realizar una acción común para
todas las opciones. Se insertan fragmentos de
código que se ejecuten tras la gestión de las
excepciones. Este código se ejecutará tanto si se
ha tratado una excepción (catch) como si no.
Este tipo de código se inserta en una sentencia
finally, que será ejecutada tras el bloque try o
catch :
try {
} catch( Exception e ) {
} finally {
// Se ejecutara tras try o catch
}
Aquí va un Ejemplo
88. Curso de C++H
Lanzamiento de excepciones: throw - throws
Muchas veces el programador dentro de un
determinado método deberá comprobar si alguna
condición de excepción se cumple, y si es así
lanzarla. Para ello se utilizan las palabras
reservadas throw y throws.
Por una parte la excepción se lanza mediante la
sentencia throw:
if ( condicion_de_excepcion == true )
throw new miExcepcion();
89. Curso de C++H
Se puede observar que hemos creado un objeto
de la clase miExcepcion, puesto que las
excepciones son objetos y por tanto deberán ser
instanciadas antes de ser lanzadas.
Aquellos métodos que pueden lanzar
excepciones deben usar esas excepciones en su
declaración. Para ello se utiliza la sentencia
throws:
Aquí va un Ejemplo
90. Curso de C++H
tipo_devuelto miMetodoLanzador() throws
miExcep1, miExcep2 {
// Código capaz de lanzar excepciones miExcep1
y miExcep2
}
Se puede observar que cuando se pueden lanzar
en el método más de una excepción se deben
indicar en su declaración separadas por comas.