Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacin Avanzada
MC Nicols Quiroz Hernndez
MC Nicols Quiroz MC Nicols Quiroz
Contenido del curso
Programa
Bibliografa
Criterios de
Evaluacin
2
MC Nicols Quiroz MC Nicols Quiroz
Unidad I. INTRODUCCIN
Introduccin a la programacin orientada
a objetos.
El concepto de objeto.
Caractersticas de los objetos.
Aplicacin de los objetos a la solucin de
problemas.
MC Nicols Quiroz MC Nicols Quiroz
Unidad II. MODELADO DE PROGRAMAS
USANDO OBJETOS
Desarrollo de programas.
Clases.
Encapsulacin
Clases amigas.
Sobrecarga.
Constructores y destructores.
Herencia.
Polimorfismo.
3
MC Nicols Quiroz MC Nicols Quiroz
Unidad III. PROGRAMACIN EN
AMBIENTES VISUALES
Introduccin a la programacin en ambientes
visuales.
Desarrollo de programas en un ambiente visual.
MFC
Controles Comunes
Clases de la MFC
Aplicaciones utilizando MFC
MC Nicols Quiroz MC Nicols Quiroz
Unidad IV. GRAFICACIN
El modo grfico.
Manejo de Archivos (CFile)
Animacin.
4
MC Nicols Quiroz MC Nicols Quiroz
Bibliografa
Programacin Orientada a
Objetos
Ceballos, Fco. Javier
Alfaomega
Visual C++ 6, Aplicaciones
para Win32
Ceballos, Fco. Javier
Alfaomega
Edicin Especial Visual C++ 6
Kate Gregory
Prentice Hall
Cmo programar en C/C++.
Deitel
Prentice Hall.
Enciclopedia del Lenguaje C
Ceballos Fco. Javier
Addison-Wesley
Iberoamericana
Programacin en C++,
Algoritmos, estructurad de
datos y objetos.
Joyanes Aguilar
McGraw Hill
C++ Programacin Orienta a
objetos
Smith J A
Paraninfo
Visual C++ 5 para
desarrolladores
Bennet D.
Sams
Thinking in C++
Bruce Eckel
MC Nicols Quiroz MC Nicols Quiroz
Bibliografa Reciente
Ivor Hortons Beginning
Visual C++ 2005
Ivor Horton
Wiley Publishing, Inc.
Ivor Hortons Beginning
Visual C++ 2008
Ivor Horton
Wiley Publishing, Inc.
Extending MFC
Applications with the .NET
Framework
Tom Archer,
Nishant Sivakumar
Addison Wesley
Programming with Microsoft
Visual C++ .NET, Sixth Edition
Shepherd, George
Microsoft Press
Microsoft Visual C++ 2005
Express Edition Programming
for the Absolute Beginner
Aaron Miller with Jerry Lee
Ford, Jr.
Thomson Course Technology
C++/CLI: The Visual C++
Language for .NET
Gordon Hogenson
Springer
5
MC Nicols Quiroz MC Nicols Quiroz
Criterios de acreditacin
Aprobar un examen por lo menos, para aprobar
el curso en ordinario.
Acreditar al menos el 80% de las Programas y
tareas.
Asistir al menos a un 80% de las clases.
Entregar proyecto final (obligatorio).
Nota: No hay extraordinario
MC Nicols Quiroz MC Nicols Quiroz
Evaluacin
Primavera - otoo
20% Examen Departamental
10% Examen parcial
40% Tareas y Programas
20% Proyecto
10% Presentacin del proyecto
6
MC Nicols Quiroz MC Nicols Quiroz
Evaluacin Verano
Propuesta
30% Exmenes
50% Programas
20% Proyecto
Programming with Visual C++
2005
Nicols Quiroz Herndez
7
MC Nicols Quiroz MC Nicols Quiroz
Evolucin
Microsoft Visual Studio 5
Microsoft Visual Studio 6
Microsoft Visual Studio .NET (2002)
Microsoft Visual Studio .NET 2003
Microsoft Visual Studio 2005
Microsoft Visual Studio 2008
MC Nicols Quiroz MC Nicols Quiroz
Lenguajes de programacin
Visual Basic Express Edition
Visual C# Express Edition
Visual C++ Express Edition
Visual J# Express Edition (Desapareci en Visual
Studio 2008)
Visual Web Developer Express Edition (para
programar en ASP.NET)
8
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio 5.0
Microsoft present la primera versin de Visual Studio en
1997
Visual Studio 5.0
Ediciones: Professional y Enterprise.
Visual Basic 5.0
Visual C++ 5.0
Visual J++ 1.1 para programacin en Java y Windows
Visual FoxPro 5.0
Visual Interdev para la creacin dinmica de sitios web mediante
ASP (Active Server Pages)
La librera Microsoft Developer Network a modo de documentacin.
Visual Studio 5.0 varios lenguajes utilizaran el mismo
entorno de desarrollo. Visual C++, Visual J++, Interdev y
MSDN Library, denominado Developer Studio.
Por otro lado, Visual Basic y Visual FoxPro usaban
diferentes entornos.
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio 6.0
Se lanz en 1998 y fue la ltima versin en
ejecutarse en la plataforma Win9x.
Esta versin fue la base para el sistema de
desarrollo de Microsoft para los siguientes 4
aos, en los que Microsoft migr su estrategia de
desarrollo al Framework .NET.
9
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio .NET (2002)
En esta versin se produjo un cambio sustancial, la introduccin
de la plataforma .NET de Microsoft.
.NET es una plataforma de ejecucin intermedia multilenguaje,
de forma que los programas desarrollados en .NET no se
compilan en lenguaje mquina, sino en un lenguaje intermedio
denominado Microsoft Intermediate Language (MSIL).
Introduccin del lenguaje C#, un lenguaje nuevo diseado
especficamente para la plataforma .NET, basado en C++ y Java.
C++ aadi extensiones al lenguaje llamadas Managed
Extensions for C++ con el fin de que los programadores
pudieran crear programas en .NET.
Esta versin requiere un sistema operativo basado en NT. La
versin interna de Visual Studio .NET es la 7.0.
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio .NET 2003
Visual Studio .NET 2003 supone una actualizacin menor de
Visual Studio .NET. Se actualiza el .NET Framework a la
version 1.1. Tambin se aade soporte con el fin de escribir
aplicaciones para determinados dispositivos mviles, con
ASP.NET o con el .NET Compact Framework.
Adems el compilador de Visual C++ se mejora para
cumplir con ms estndares, el Visual C++ Toolkit 2003.
Visual Studio 2003 se lanza en 4 ediciones: Academic,
Professional, Enterprise Developer, y Enterprise Architect.
La versin interna de Visual Studio .NET 2003 es la 7.1
aunque el formato del archivo es 8.0.
Studio 2003 no funciona, ni ser soportado en su sistema
operativo Windows Vista.
10
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio 2005
Lanzado en Octubre de 2005 en ingls. En castellano
Febrero de 2006. Microsoft .NET versin 2.0.
A partir de la versin 2005 Microsoft ofrece gratuitamente
las Express Editions.
Visual Studio 2005 tambin aade soporte de 64-bit,
soporta compilacin para x86-64 (AMD64 e Intel 64) e IA-
64 (Itanium).
Se lanz el service Pack 1 para Visual Studio 2005 el 14 de
Diciembre de 2006.
La versin interna de Visual Studio 2005 es la 8.0, mientras
que el formato del archivo es la 9.0.
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio 2008
Lanzado en Noviembre de 2007 en ingls, la versin en
castellano en Febrero de 2008.
El nuevo framework (.Net 3.5) est diseado para
aprovechar las ventajas que ofrece el sistema operativo
Windows Vista.
Subsistemas:
Windows Communication Foundation (WCF)
construccin de aplicaciones orientadas a servicios
Windows Presentation Foundation (WPF)
creacin de interfaces de usuario ms dinmicas
Mejoras en Microsoft Foundation Class Library (MFC) y
Visual C++.
11
MC Nicols Quiroz MC Nicols Quiroz
Visual Studio 2008
LINQ (Language Integrated Query) es un nuevo conjunto
de herramientas diseado para reducir la complejidad del
acceso a Base de Datos, a travs de extensiones para C++
y Visual Basic as como para Microsoft .NET Framework.
Permite filtrar, enumerar, y crear proyecciones de muchos
tipos y colecciones de datos utilizando todos la misma
sintaxis, prescindiendo del uso de lenguajes especializados
como SQL o XPath.
.NET 3.5 incluye biblioteca ASP.NET AJAX para desarrollar
aplicaciones web ms eficientes, interactivas y altamente
personalizadas que funcionen para todos los navegadores
ms populares y utilicen las ltimas tecnologas y
herramientas Web, incluyendo Silverlight y Popfly.
MC Nicols Quiroz MC Nicols Quiroz
Developing C++ applications
Windows
Form
12
MC Nicols Quiroz MC Nicols Quiroz
The .NET Framework
The .NET Framework is a central concept in Visual C++
2005.
The .NET Framework consists of two elements:
The Common Language Runtime (CLR) in which your application
executes.
A set of libraries called the .NET Framework class libraries.
You can write applications two kind:
Applications that natively execute on your computer. Native C++
programs.
Write applications to run under the control of the CLR in an extended
version of C++ called C++/CLI. CLR programs, or C++/CLI
programs.
The .NET Framework is a component of the Windows
operating system that makes it easier to build software
applications and Web services.
Unidad 0
Repaso
13
MC Nicols Quiroz MC Nicols Quiroz
Tipos de datos simples o no estructurados
Un tipo de dato define un conjunto de valores que
puede tener una variable junto con un conjunto de
operaciones que se pueden realizar sobre la
variable.
Enteros
Flotantes (Reales)
Carcter
Lgico o Booleano (verdadero y falso)
MC Nicols Quiroz MC Nicols Quiroz
without issues. Notepad.exe creates ASCII text, or in MS Word you can save a file as 'text only'
14
MC Nicols Quiroz MC Nicols Quiroz
Cdigo extendido ASCII
MC Nicols Quiroz MC Nicols Quiroz
Tipos de datos fundamentales
(datos simples o no estructurados)
C Enteros:
C char, short, int, long,
enum
C Flotantes:
C float, double, long
double
C Caracteres:
C char
C Otros:
C void
C++
__int8 entero 8-bit char
__int16 entero 16-bit short
__int32 entero 32-bit int, long
__int64 entero 64-bit
bool entero de 8 bit (true, false)
string cadenas
15
MC Nicols Quiroz MC Nicols Quiroz
Tamao en bytes
16/32 2/4 int
80 10 long double
64 8 double
0 0 void
8 1 bool
32 4 float
32 4 long
8 1 char
bits Byte Tipo
MC Nicols Quiroz MC Nicols Quiroz
Intervalo
long
int
int
short
char
4,294,967,295 0 unsigned
2,147,483,647 2,147,483,648 signed
4,294,967,295 0 unsigned
2,147,483,647 2,147,483,648 signed
65,535 0 unsigned
32,767 32,768 signed
65,535 0 unsigned
32,767 32,768 signed
255 0 unsigned
127 128 signed
Mximo Mnimo Tipo
16
MC Nicols Quiroz MC Nicols Quiroz
Flotantes
Positivo Negativo Tipo
3.362103x10
-4932
a
1.189731x10
+4932
-1.189731x10
+4932
a
-3.362103x10
-4932
long double
2.22507x10
-308
a
1.79769x10
+308
-1.79769x10
+308
a
-2.22507x10
-308
double
1.175494x10
-38
a
3.402823x10
+38
-3.402823x10
+38
a
-1.175494x10
-38
float
MC Nicols Quiroz MC Nicols Quiroz
Palabras Reservadas en ANSI C
U 4
while this reinterpret_cast __int16 false _cs
wchar_t template register __int8 extern continue
volatile switch public int _export const_cast
void struct protected interrupt explicit const
virtual _stdcall private inline __except class
unsigned static_cast pascal _import _es char
using static operator if enum cdecl
union _ss new huge else catch
typeid sizeof near goto dynamic_cast case
typename signed namespace friend _ds bool
typedef short mutable for double break
try _seg long float do auto
true _saveregs _loadds __finally delete asm
throw __rtti __int64 _fastcall default _asm
__thread return __int32 far __declspec __asm
17
MC Nicols Quiroz MC Nicols Quiroz
Palabras Reservadas en C++
xor_eq xor
w_char virtual using typename typeid
try true throw this template
static_cast reinterpret_cast public protected private
or_eq or operator not_eq not
new namespace mutable inline friend
false export explicit dynamic_cast delete
const_cast compl class catch bool
bitor bitand asm and_eq and
MC Nicols Quiroz MC Nicols Quiroz
Secuencias de escape
Constante hexadecimal \x
Constante octal \o
Alerta \a
Tabulacin vertical \v
Barra invertida \\
Nulo \0
Comilla simple \
Comillas dobles \
Tabulacin horizontal \t
Retorno de carro \r
Salto de lnea \n
Salto de pgina \f
Espacio atrs \b
18
MC Nicols Quiroz MC Nicols Quiroz
Operadores aritmticos
Incremento ++
Decremento --
Divisin mdulo (Residuo) %
Divisin /
Multiplicacin *
Suma +
Resta, menos -
Accin Operador
MC Nicols Quiroz MC Nicols Quiroz
Operadores relacionales
Distinto que !=
Igual que ==
Menor o igual <=
Menor <
Mayor o igual >=
Mayor >
Accin Operador
Los operadores pueden Los operadores pueden
ser de tipo entero, ser de tipo entero,
flotante o apuntador. flotante o apuntador.
El resultado es un valor El resultado es un valor
booleano booleano (cierto o (cierto o
falso). falso).
19
MC Nicols Quiroz MC Nicols Quiroz
Lgicos (varables)
Negacin (NO) !
OR (O) **
AND (Y) &&
Accin Operador
MC Nicols Quiroz MC Nicols Quiroz
Operadores a nivel de bits
Desplazamiento a la
izquierda
<<
Desplazamiento a la
derecha
>>
Complemento a uno
-
Or exclusiva
^
Or
*
And
&
Accin Operador
20
MC Nicols Quiroz MC Nicols Quiroz
Precedencia
mbito ::
= += -= *= /=
& ^ | && || ?
== !=
relacionales < <= > >=
corrimientos << >>
+ -
operadores
aritmticos
* / %
ndice, preinc,
apuntadores
- + ~ ! * & ++v --v sizeof new
delete (tipo)
postinc ( ) [ ] . -> ++ -- ???_cast typeid
descripcin Smbolo
MC Nicols Quiroz MC Nicols Quiroz
Tipos de datos estructurados
Arreglos.
Estructuras, uniones, Enumerativos y campo de
bits.
Archivos.
21
MC Nicols Quiroz MC Nicols Quiroz
Arreglos
Un arreglo es una coleccin de variables del mismo
tipo que se referencian por un nombre comn.
Declaracin:
tipo Nombre_Arreglo [tam];
char p[10];
int vector[50];
float A[10], B[32];
Todos los arreglos tienen el 0 como ndice de su primer elemento.
MC Nicols Quiroz MC Nicols Quiroz
Arreglos Multidimensionales
Arreglo de dos dimensiones:
int Matriz[10][10];
Arreglo de tres dimensiones:
int Matriz3D[10][10][10];
22
MC Nicols Quiroz MC Nicols Quiroz
Asignacin
int X[10], Y[10];
X[0] = 7; X[1] = 23; X[2] = 1; X[3]= -12
Y[i] = X[0];
X
i
1
2
-12 23 7
3 1 0
MC Nicols Quiroz MC Nicols Quiroz
Cadenas
Arreglo de caracteres de cualquier longitud
que termina con un nulo (\0).
ejemplo:
char cad[11]= Hola Mundo;
cad
i
\0 o d n u M a l o H
10 9 8 7 6 5 4 3 2 1 0
23
MC Nicols Quiroz MC Nicols Quiroz
Leer una cadena
Leer una cadena de caracteres con la funcin scanf
Por ejemplo: nombre y apellidos
char cad[50];
printf(Escribir Nombre Completo:);
scanf(%s, cad);
printf (cadena: %s, cad);
MC Nicols Quiroz MC Nicols Quiroz
gets
Obtiene una cadena de la entrada estndar (teclado)
char *gets(char *s);
Retorna la cadena en el argumentos, o NULL sino
tuvo xito. Puede leer espacios en blanco.
char cad[50];
printf(Escribir Nombre Completo:);
gets(cad);
printf (cadena: %s, cad);
U 4
24
MC Nicols Quiroz MC Nicols Quiroz
Estructuras, uniones, etc.
Una Estructura es una agrupacin de variables
bajo un mismo nombre.
La Unin es una variable que puede contener
miembros de diferentes tipos, en una misma
zona de memoria.
Un Campo de bits es un conjunto de bits
adyacentes dentro de una unidad direccionable.
La Enumeracin es una lista de smbolos.
La palabra clave typedef simplemente crea un
nuevo nombre para un tipo ya existente.
MC Nicols Quiroz MC Nicols Quiroz
Declaracin de Estructura
struct nombre_struct{
declaracin de miembros;
};
variables:
struct nombre_struct info1, *info2;
25
MC Nicols Quiroz MC Nicols Quiroz
Estructura
struct dir{
char nombre[30];
double adeudo;
long matricula;
};
variables: struct dir info1, *info2;
double x;
asignacin: gets(info1.nombre)
info1.matricula = 10021234;
info2 ->matricula = 10023424;
strcpy(info1.nombre, Nicolas Quiroz);
x= info1.adeudo; //obtiene un valor
MC Nicols Quiroz MC Nicols Quiroz
Declaracin de Unin
union nombre_union{
declaracin de los miembros;
};
variables:
union nombre_union x, y;
26
MC Nicols Quiroz MC Nicols Quiroz
Unin
union datos{
char var1;
int var2;
float var3;
};
union datos x, y;
MC Nicols Quiroz MC Nicols Quiroz
Tipo enumerativo (enum)
Para C un tipo enumerado es un tipo int.
Para C++ un tipo enumerado es un nuevo tipo.
enum colores {azul, verde, rojo};
colores color1 = azul; //correcto
int color2 = verde; //correcto
colores color3 = 2; //error: asignacin de un entero
colores color4 = colores(2); //correcto (conversin explicita)
27
MC Nicols Quiroz MC Nicols Quiroz
Campo de bits
Declaracin:
tipo [identificador] : expresin constante;
expresin constante especifica el nmero de bits en el
campo.
El tipo tiene que ser entero con signo o sin signo.
Se pueden definir como miembros de una estructura.
MC Nicols Quiroz MC Nicols Quiroz
Entrada/salida Estndar (Teclado/Monitor)
operadores de insercin o de extraccin
Ejemplos:
C C++
scanf("%d", &n); cin >> n; (extraccin)
printf(n = %d, n); cout << n; (insercin)
28
MC Nicols Quiroz MC Nicols Quiroz
Nmeros Primos
41 23 17 13 11 37 31 29 7 5 3 2
Cmo?
Ningn nmero par es primo, solamente algunos
impares, probar los impares.
MC Nicols Quiroz MC Nicols Quiroz
Los primeros 100
Nmeros primos
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
const int MAX = 100; // Numero de primos requerido
long primos[MAX] = { 2,3,5 }; // Primeros 3 primos
long probar = 5; // Candidato a primo
int conteo = 3; // Conteo de los primos encontrados
int encontrado = 0; // Indica si un primo es encontrado
do{probar += 2; // Valor siguiente para checar
encontrado = 0; // coloca indicador de encontrao
for(int i = 0; i < conteo; i++) // Divisin para probar si es primo
{ encontrado= (probar % *(primos + i)) == 0; // Verdadero si divisin es
if(encontrado) // Si divisin es exacta //exacta
break; // Es no un primo
}
if (encontrado == 0) // Se obtuvo un primo
*(primos + conteo++) = probar; // se guarda en el arreglo primos
}while(conteo < MAX);
29
MC Nicols Quiroz MC Nicols Quiroz
Los primeros 100 Nmeros primos
Continuacin
// Se imprimen 5 primos en una renglon
for(int i = 0; i < MAX; i++)
{
if(i % 5 == 0)
cout << endl;
cout << setw(15) << *(primos + i);
}
cout << endl;
return 0;
}
MC Nicols Quiroz MC Nicols Quiroz
Hacer un programa que utilice apuntadores
para escribe una cadena al revs (InvCadena.cpp)
void main()
{ char cad[20], *p; int i, j;
p = cad;
cout<<"Dar cadena:"<<endl;
cin.getline( cad, 20);
for ( i = 0; i < 20; i++) //tamao de la cadena
if (cad[ i ] == '\0')
{ p = p + i - 1;
break;
}
for ( j = 0; j < i; j++) //inversin de la cadena
{
cout<<*p;
p --;
}
cout<<endl;
}
30
MC Nicols Quiroz MC Nicols Quiroz
Ejemplo de estructuras (estPersona.cpp)
struct Persona
{
char Nombre[50];
int Edad;
float Peso;
};
#include<iostream.h>
void main()
{
Persona P1;
cout<<"Datos de una persona"<<endl
<<"Nombre: ";
cin.getline(P1.Nombre, 50);
cout<<"Edad: ";
cin>>P1.Edad;
cout<<"Peso: ";
cin>>P1.Peso;
cout<<"Resultados"<<endl
<<P1.Nombre<<endl
<<P1.Edad<<endl
<<P1.Peso<<endl;
}
MC Nicols Quiroz MC Nicols Quiroz
Apuntadores a estructuras
void main()
{
Persona P1, *P3;
P3=&P1;
cout<<"Datos de una persona"<<endl
<<"Nombre: ";
cin.getline(P1.Nombre,50);
cout<<"Edad: ";
cin>>P3->Edad;
cout<<"Peso: ";
cin>>P1.Peso;
cout<<"Resultados"<<endl
<<P1.Nombre<<endl
<<P1.Edad<<endl
<<P3->Peso<<endl;
}
Apuntador a
estructura
Dato obtenido
por apuntador
Dato asignado
por apuntador
Inicializacin
del apuntador
31
C++
Programacin
Orientada a Objetos
(POO)
MC Nicols Quiroz Hernndez
MC Nicols Quiroz MC Nicols Quiroz
POO
La Programacin Orientada a Objetos toma las mejores
ideas de la programacin estructurada la combina con
nuevos y poderosos conceptos: objetos, polimorfismo y
herencia.
La Programacin Orientada a Objetos permite descomponer
fcilmente un problema en subgrupos de partes
relacionadas. Entonces, puede traducir estos subgrupos en
unidades autocontenidas llamadas Objetos.
32
MC Nicols Quiroz MC Nicols Quiroz
POO
Objeto
Entidad lgica que contiene datos y cdigo que
manipula esos datos.
Parte del cdigo y datos pueden ser privados
del objeto (encapsulacin).
MC Nicols Quiroz MC Nicols Quiroz
POO
Polimorfismo: Permite usar un nombre para varios
propsitos relacionados pero ligeramente diferentes.
El polimorfismo permite que las instancias de diferentes
clases respondan a la misma funcin en forma adecuada
para cada clase.
Herencia: La herencia es propiedad que permite a los
objetos construirse a partir de otros objetos. El concepto de
herencia est presente en nuestras vidas diarias donde las
clases se dividen en subclases.
33
MC Nicols Quiroz MC Nicols Quiroz
Los objetos soportan una serie de
caractersticas
Se agrupan en grupos denominados clases
Contienen datos internos que definen su estado
actual.
Soportan ocultamiento de datos.
Pueden heredar propiedades de otros objetos.
Pueden comunicarse con otros objetos enviando
o pasando mensajes.
Tienen mtodos que definen su comportamiento
MC Nicols Quiroz MC Nicols Quiroz
Clase
Una clase es un tipo especial de datos, y esta
orientado a la creacin de objetos y que consta
de unos miembros que pueden ser datos o
mtodos (funciones) privadas o pblicas.
Una clase es un tipo de dato que contiene
elementos llamados datos miembro, y funciones
que manipulan esos datos (llamados funcin
miembro o mtodo). Una clase se puede definir
con una estructura (struct), una unin (unin) o
una clase (class).
34
MC Nicols Quiroz MC Nicols Quiroz
MENSAJES: Activacin de Objetos
La comunicacin con el objeto se realiza a travs del paso de
mensajes.
El envo de un mensaje a una ejemplar (Instancia) de una
clase produce la ejecucin de un mtodo ( funcin miembro
en C++).
El paso de mensajes es el termino utilizado para referirnos a
la invocacin o llamada de una funcin miembro de un
objeto.
La nocin de paso de mensajes es fundamental en todos los
lenguajes de programacin Orientada a Objetos.
MC Nicols Quiroz MC Nicols Quiroz
Comunicacin entre Objetos
atributos atributos
mtodos mtodos
Objeto a
Mensajes Mensajes
Privados
atributos atributos
mtodos mtodos
Objeto b
Pblicos
35
MC Nicols Quiroz MC Nicols Quiroz
Declaracin de una clase
class Nombre_Clase
{
public:
//miembros pblicos;
private:
//miembros privados;
protected:
// miembros protegidos;
};
class Circulo
{
private:
double x, y;
double radio;
void AsignarValorX( double x );
}
MC Nicols Quiroz MC Nicols Quiroz
Acceso a los miembros
NombreObjeto.NombreMiembro
void main( )
{
Circulo c;
c.AsignarValorX( 3);
}
36
MC Nicols Quiroz MC Nicols Quiroz
Rectngulo
Permetro y rea
Datos (atributos):
Largo
Ancho
Mtodos (funciones)
Area()
Perimetro()
AsignarAncho()
ObtenerAncho()
AsignarLargo()
ObtenerLargo()
largo largo
ancho
MC Nicols Quiroz MC Nicols Quiroz
Clase Rectngulo
Area Area() ()
Perimetro Perimetro() ()
AsignarAncho AsignarAncho() ()
ObtenerAncho ObtenerAncho() ()
Largo Largo
Ancho Ancho
Privados
Pblicos
37
MC Nicols Quiroz MC Nicols Quiroz
Clase Rectangulo
class Rectangulo
{
private: //atributos
float ancho, largo;
public: //mtodos
float Area()
{
return largo*ancho;
}
void AsignarAncho(float an)
{
ancho = an;
}
float ObtenerAncho()
{
return ancho;
}
};
MC Nicols Quiroz MC Nicols Quiroz
Definicin de mtodos
fuera de la clase
ValorRetorna NombreClase::NombreMetodo(parametros)
{
//codigo
}
float Rectangulo::ObtenerAncho( )
{
return ancho;
}
Ejemplo:
38
MC Nicols Quiroz MC Nicols Quiroz
Tringulo
Permetro y rea
) )( )( ( c s b s a s s A =
2
) ( c b a
s
+ +
=
2
h b
A
=
a a
b b
c c
c b a P + + =
MC Nicols Quiroz MC Nicols Quiroz
Clase Tringulo
Miembros
Atributos:
lado1
lado2
lado3
color
Mtodos
AsignarLados( )
AsignarColor()
ObtenerLados()
ObtenerColor()
Area(arg)
Perimetro(arg)
39
MC Nicols Quiroz MC Nicols Quiroz
Constructores
1. El nombre del constructor debe ser idntico al nombre de su clase.
2. No debe incluir ningn tipo de retorno, ni siquiera void.
3. Una clase puede tener cualquier cantidad de constructores, incluso
ninguno. En este ltimo caso, el compilador automticamente crea
uno para esta clase.
4. El constructor predeterminado es aquel que no tiene parmetros o
posee una lista de parmetros, donde todos usan argumentos
predeterminados.
5. Se utilizan para inicializar los objetos.
6. Un constructor de copia le permite crear instancias de clase
copiando los datos de instancia existentes.
MC Nicols Quiroz MC Nicols Quiroz
La sintaxis general, constructores
class nombreClase
{
public:
nombreClase( ); //Constructor predeterminado
nombreClase(const nomClase& c); //Constructor de copia
nombreClase(<lista de parametros>); //otro constructor
};
40
MC Nicols Quiroz MC Nicols Quiroz
Destructores
1.- El nombre del destructor debe comenzar con una tilde (~). El resto
del nombre del destructor debe ser idntico al nombre de su clase.
2.- No debe incluir ningn tipo de retorno, ni siquiera void.
3.- Una clase no puede tener mas de un destructor. Adems, si omites
el destructor, el compilador lo crea automticamente.
4.- El destructor no puede tener ningn parmetro.
5.- El sistema en tiempo de ejecucin llama automticamente a un
destructor de la clase cuando la instancia de esa clase cae fuera de
alcance o cuando la instancia se borra explcitamente.
MC Nicols Quiroz MC Nicols Quiroz
Destructores
Las clases de C++ pueden contener destructores que eliminan
automticamente las instancias de la clase.
La sintaxis general para los destructores es:
class nombreClase
{
// datos miembros
public:
nombreClase( ); //Constructor predeterminado
//otros constructores
~nombreClase( ); //destructor
//Otros mtodos miembro
};
41
MC Nicols Quiroz MC Nicols Quiroz
Ejemplo de constructores y destructores
Crea un arreglo dinmico (el objeto)
Asigna valores a los elementos del arreglo
dinmico.
Despliega los valores del arreglo dinmico.
Elimina el arreglo dinmico.
MC Nicols Quiroz MC Nicols Quiroz
Constructores y destructores
# include <iostream.h>
const unsigned MIN_SIZE = 4;
class Array
{
protected:
double *dataPtr;
unsigned sz;
public:
Array(unsigned size = MIN_SIZE);
Array(const Array& a);
~Array();
{
delete[ ] dataPtr;
}
clase
miembros static,
comparten
memoria
MC Nicols Quiroz MC Nicols Quiroz
Clase Fecha
class CFecha
{
// Atributos
private:
int m_dia, m_mes, m_anyo;
static CFecha fechaPorOmision; // se define en fecha.cpp
// Mtodos
protected:
bool bisiesto() const;
public:
CFecha(int dd = 1, int mm = 1, int aaaa = 2001); // constructor
void asignarFecha(int dd = 0, int mm = 0, int aaaa = 0);
void obtenerFecha(int *dd, int *mm, int *aaaa) const;
bool fechaCorrecta() const;
const int& obtenerDia() const;
static void asignarFechaPorOmision(int = 0, int = 0, int = 0);
static void obtenerFechaActual(int&, int&, int&);
};
69
Sobrecarga Operadores
MC Nicols Quiroz Henndez
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
Se refiere a un operador que es capaz de
desarrollar su funcin en varios contextos
diferentes.
Ejemplos:
Operador de extraccin (>>)
Operador de inserccin (<<)
Asignacin (=)
70
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
declaracin
tipo operator operador([argumentos]);
tipo indica el tipo de valor retornado por la funcin.
Operadores que se pueden sobrecargar:
delete new ->* -> ( ) [ ] >>= <<=
|= &= ^= %= /= *= -= +=
|| && != == >> << -- ++
>= <= > < = , ! ~
| & ^ % / * - +
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
Cuando se sobrecarga un operador, ste conserva
su propiedad de binario o unario, y mantiene
invariable su propiedad de evaluacin y su
asociatividad.
Los operadores sobrecargados son normalmente
utilizados con clases, para facilitar determinadas
operaciones con los objetos de las mismas.
tiles cuando se trabajo con tipos abstractos de
datos que definen objetos pertenecientes al
campo de las matemticas.
71
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
mtodos externo
Un operador unario se aplica sobre un solo
operando y un operador binario sobre dos
operandos.
La sobrecarga de un operador unario utilizando
una funcin externa debe tomar un parmetro, y
dos cuando se sobrecargue un operador binario.
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
mtodos miembros de una clases
Cuando la funcin que sobrecarga un operador es
un mtodo de una clase, existe un parmetro
implcito (this), se trata del objeto para el que es
invocado el mtodo.
Por lo tanto, el mtodo utilizado para sobrecargar
un operador unario tendr cero parmetros
explcitos y un binario tendr uno.
72
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
Realizar un programa que permita
realizar la suma y resta de nmeros
complejos.
) 4 1 ( ) 3 2 ( j j Z + + + =
MC Nicols Quiroz MC Nicols Quiroz
class CComplejo
(complejo.h)
class CComplejo
{
private:
double real, imag; // parte real e imaginaria
public: // constructor con parametros por defecto
CComplejo(double r = 0, double i = 0) : real(r), imag(i) { }
CComplejo(int r) : real(r), imag(0) {}
double ObtenerParteReal() const { return real; }
double ObtenerParteImag() const { return imag; }
void AsignarComplejo(double r, double i);
CComplejo operator+(CComplejo x); // sumar complejos
CComplejo operator- (CComplejo x); // restar complejos
};
73
MC Nicols Quiroz MC Nicols Quiroz
Implementacin de CComplejo
(complejo.cpp)
#include "complejo.h"
// Asignacin de complejos
void CComplejo::AsignarComplejo(double r, double i)
{
real = r;
imag = i;
}
// Suma de complejos
CComplejo CComplejo::operator+(CComplejo x)
{
return CComplejo(real + x.real, imag + x.imag);
}
// Diferencia de complejos
CComplejo CComplejo::operator-(CComplejo x)
{
return CComplejo(real - x.real, imag - x.imag);
}
MC Nicols Quiroz MC Nicols Quiroz
Programa principal
(principal.cpp)
#include <iostream>
#include "complejo.h"
using namespace std;
void visualizar(const CComplejo&);
int main()
{
CComplejo a, b, c(1.5, 2), d;
double re, im;
cout << "Nmero complejo - escriba re im: ";
cin >> re >> im;
a.AsignarComplejo(re, im);
b = a;
d = a + b - c; // a+b => a.operator+(b)
d = d + CComplejo(3, 3); //construye un objeto temporal (3,3)
visualizar(d);
}
74
MC Nicols Quiroz MC Nicols Quiroz
Visualizar un complejo
(principal.cpp)
// Visualizar un complejo
void visualizar(const CComplejo& c)
{
cout << "(" << c.ObtenerParteReal() << ", ";
cout << c.ObtenerParteImag() << ")" << endl;
}
MC Nicols Quiroz MC Nicols Quiroz
Operador de asignacin sobrecargado
Cuando en una clase no se define le operador de
asignacin (=), el compilador de C++ define uno por
omisin. Para la clase CComplejo, este operador es as:
CComplejo& CComplejo::operator=(const CComplejo& c)
{
real = c.real; imag = c.imag;
return *this;
}
La referencia devuelta al objeto asignado, permite realizar
asignaciones mltiples (a = b = c).
75
MC Nicols Quiroz MC Nicols Quiroz
Operadores sobrecargados
conclusiones
No se puede sobrecargar un operador binario
para crear un operador unario, y viceversa.
No se puede cambiar la precedencia de un
operador.
MC Nicols Quiroz MC Nicols Quiroz
Tarea
Crear una clase que permita realizar operaciones
con racionales (suma, resta, multiplicacin y
divisin).
class CRacional
{
private:
long m_numerador;
long m_denominador;
public:
//metodos
};
Adicionalmente pueden incluir un mtodo para
simplificar las fracciones.
76
MC Nicols Quiroz MC Nicols Quiroz
Simplificacin
for (int i=0; i<5; i++)
{
if (num % 2 == 0 && den % 2 ==0) {num/=2; den/=2;}
if (num % 3 == 0 && den % 3 ==0) {num/=3; den/=3;}
if (num % 4 == 0 && den % 4 ==0) {num/=4; den/=4;}
if (num % 5 == 0 && den % 5 ==0) {num/=5; den/=5;}
}
Comprobar un par de veces si el numerador y denominador son
divisibles entre 2,3,4 5 (los 4 primos) y en caso que as sea,
dividir ambos entre el nmero correspondiente.
Herencia
Objetivos:
Herencia
Clase derivada
Declaracin clase derivada
Acceso a clases derivadas
Acceso a los atributos de la clase base
77
MC Nicols Quiroz MC Nicols Quiroz
Clase derivada
La herencia provee el mecanismo ms simple
para especificar una forma alternativa de acceso
a una clase existente. Esta nueva clase se
denomina subclase o clase derivada y clase
existente, superclase o clase base.
Jerarqua de clases
MC Nicols Quiroz MC Nicols Quiroz
Clases Derivadas
Clase CPunto
CCuadrado CCirculo CCtriangulo
CCubo CEsfera
78
MC Nicols Quiroz MC Nicols Quiroz
Declaracin Clase derivada
class nomClaseDeri : [{private|protected|public}] nomClasBase
{
//miembros
};
Ejemplo:
class CCubo : public CCuadrado
{
//miembros
};
MC Nicols Quiroz MC Nicols Quiroz
Acceso a clases derivadas
class A; //clase base
class B: private A; //clase derivada privada
class C: protected A; //clase derivada protegida
class D: public A; //clase derivada pblica
privada: sus miembros public y protected pasan a ser private
en la clase derivada y solo sern accesibles por los mtodos
amigos de la derivada.
protegida: sus miembros public y private pasan a ser
protected en la clase derivada y solo sern accesibles por
los mtodos amigos de la derivada.
plbica: sus miembros pblicos, privados y protegidos siguen
siendo pblicos, privados y protegidos en la clase derivada
respectivamente.
79
MC Nicols Quiroz MC Nicols Quiroz
Acceso a clases
pblico protegido privado
s no no Cualquier funcin externa
s no no
Cualquier otra clase no derivada
(y no amiga)
s s no
Cualquier clase derivada
s s s
Su misma clase (mtodos y
funciones amigas)
Un miembro que en una clase es:
Accedido desde:
Una clase derivada no tiene acceso directo a los miembros
privados de su clase base, pero si puede acceder a los miembros
pblicos y protegidos.
MC Nicols Quiroz MC Nicols Quiroz
Acceso a clases derivadas
Una clase derivada puede aadir sus propios atributos y
mtodos. Si el nombre de alguno de estos coincide con el
de un miembro heredado, este ltimo queda oculto para la
clase derivada.
Los miembros heredados por una clase derivada pueden, a
su vez, ser heredados por ms clases derivadas de ella.
Los constructores no se heredan.
80
MC Nicols Quiroz MC Nicols Quiroz
Cuadrado
Permetro y rea
Datos:
m_lado
Mtodos (funciones)
Area()
Perimetro()
AsignarLado()
ObtenerLado()
Lado() //para asignar y obtener utilizando referencias
l l
MC Nicols Quiroz MC Nicols Quiroz
Declaracin CCuadrado
(cuadrado.h)
class CCuadrado
{
protected:
float m_lado;
public:
float Area(void);
float Perimetro(void);
void AsignarLado(float lado);
float ObtenerLado();
float& Lado(); //asigna y obtiene
};
Clase base Clase base
81
MC Nicols Quiroz MC Nicols Quiroz
Implementacin de CCuadrado
(cuadrado.cpp)
void CCuadrado::AsignarLado(float lado)
{ m_lado= lado;
}
float CCuadrado::ObtenerLado()
{
return m_lado;
}
float CCuadrado::Area(void)
{
return m_lado * m_lado;
}
float CCuadrado::Perimetro(void)
{ return 4 * m_lado;
}
float& CCuadrado::Lado()
{ return m_lado;
}
MC Nicols Quiroz MC Nicols Quiroz
declaracin de clase derivada
(cubo.h)
class CCubo: public CCuadrado
{
public:
float Area(void);
float Volumen(void);
};
float CCubo::Area()
{
return 6 * m_lado * m_lado;
}
float CCubo::Volumen()
{
return m_lado * m_lado * m_lado;
}
Clase
derivada
82
MC Nicols Quiroz MC Nicols Quiroz
Funcin principal
(principal.cpp)
void main(void)
{ CCuadrado X; CCubo Y; float lad;
cout<<"\nLado del cuadrado: "; cin>>lad;
X.AsignarLado(lad);
cout<<"El lado cuadrado: "<<X.ObtenerLado()<<endl;
cout<<"El area cuadrado: "<<X.area()<<endl;
cout<<"El perimetro: "<<X.perimetro()<<endl;
getch();
cout<<"\n\nLado del cubo: "; cin>>lad;
Y.AsignarLado(lad);
cout<<"El Lado del cubo: "<<Y.ObtenerLado()<<endl;
cout<<"El area del cubo: "<<Y.area()<<endl;
cout<<"Volumen: "<<Y.volumen()<<endl;
getch();
}
MC Nicols Quiroz MC Nicols Quiroz
Acceso a atributos con el mismo nombre
class ClaseA
{
public:
int atributo_x;
ClaseA(int x=1):atributo_x(x){}
int Metodo_x()
{
return atributo_x*10;
}
int Metodo_y()
{
return atributo_x + 100;
}
};
class ClaseB: public ClaseA
{
public:
int atributo_x;
ClaseB(int x=2):atributo_x(x){ }
int Metodo_x()
{
return atributo_x + 20;
}
};
83
MC Nicols Quiroz MC Nicols Quiroz
Acceso a atributos con el mismo nombre
void main()
{
ClaseB ObjB;
cout<<"Herencia"<<endl<<endl
<<ObjB.atributo_x<<endl //que escribe?
<<ObjB.Metodo_y()<<endl // "
<<ObjB.Metodo_x()<<endl; // "
};
int ClaseB::Metodo_x()
{
return ClaseA::atributo_x*10;
}
atributo_x de la clase base
Cmo accesar al atributo_x de la clase base desde la derivada?
herencia2.cpp
MC Nicols Quiroz MC Nicols Quiroz
Concluciones
Para acceder a un atributo o mtodo que ha sido redefinido en
la clase derivada, se utiliza el nombre de su clase ms el
operador de mbito ::.
Cuando se crea un objeto de una clase derivada, se invoca a su
constructor, que a su vez invoca al constructor sin parmetros
de la clase base, que su vez invoca al constructor de su clase
base, y as sucesivamente. Por lo tanto; primero se ejecutan
los constructores de las clases base de arriba abajo en la
jerarqua de clases y finalmente el de la clase derivada. Los
destructores se ejecutan en orden inverso.
84
MC Nicols Quiroz MC Nicols Quiroz
Mtodos virtuales
Un mtodo virtual es un miembro de una clase que puede
ser redefinido en cada una de las clases derivadas de sta,
y una vez redefinido puede ser accedido mediante un
apuntador o una referencia a la clase base.
La redefinicin de un mtodo virtual en una clase derivada
debe tener el mismo nombre, nmero y tipos de
parmetros, y tipo de valor retornado que en la clase base.
Un mtodo se declara virtual escribiendo la palabra clave
virtual al principio de la declaracin del mtodo en la clase
donde aparece por primera vez.
class A
{
virtual void fun();
}