Вы находитесь на странице: 1из 84

1

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;
}

unsigned Size() const


{
return sz;
}
void store(double x, unsigned index)
{
if (index < sz)
dataPtr[ index ] = x;
}
double recall(unsigned index)
{
if (index < sz )
return dataPtr [ index ];
return -1;
}
};
42
MC Nicols Quiroz MC Nicols Quiroz
Constructores
Array::Array(unsigned Size)
{
sz = (size < MIN_SIZE) ? MIN_SIZE : size;
dataPtr = new double[sz];
}
Array::Array(const Array& a)
{
sz = a.sz;
dataPtr = new double[sz];
for (int i = 0; i < sz; i++)
dataPtr[i] = a.dataPtr [ i ];
}
MC Nicols Quiroz MC Nicols Quiroz
Funcin principal (main)
int main()
{
Array Arr(10);
double x;
//asigna datos a los elementos del arreglo
for (unsigned i = 0; i < Arr.Size( ); i++)
Arr.store((double) (i*i), i);
//despliega los datos del elemento arreglo
cout<<"Arr tiene los siguientes valores:"<<endl;
for(int i = 0; i < Arr.Size(); i++)
cout<<"Arr[" <<i<<"] = " << Arr.recall(i) << endl;
return 0;
}
43
MC Nicols Quiroz MC Nicols Quiroz
Tarea POO
Directorio
Disear un programa OO para llevar el control de
datos sobre los empleados de una empresa.
Nombre, direccin, telfono, salario, fecha de
nacimiento, CURP, etc.
Objeto?
Persona Persona
MC Nicols Quiroz MC Nicols Quiroz
Clase Persona
Miembros
Datos:
Mtodos:
Nombre
Apellidos
Direccin
Telfono
Salario
ID
AsignarNombre, ObtenerNombre
AsignarApellido, ObtenerApellido
AsignarDireccin, ObtenerDireccin
AsignarTelfono, ObtenerTelfono
AsignarSalario, ObtenerSalario
44
MC Nicols Quiroz MC Nicols Quiroz
Formato de E/S
Dos formas
Usando las funciones miembro de la clase ios
Manipuladores
Ejemplo: activar y desactivar
Flujo.setf(ios::showbase);
Flujo.unsetf(ios::showbase);
MC Nicols Quiroz MC Nicols Quiroz
E/S con formato miembros de ios
boolalpha, to insert or extract objects of type bool as names (such as
true and false) rather than as numeric values.
dec, to insert or extract integer values in decimal format.
fixed, to insert floating-point values in fixed-point format (with no
exponent field).
hex, to insert or extract integer values in hexadecimal format.
internal, to pad to a field width as needed by inserting fill characters at a
point internal to a generated numeric field.
left, to pad to a field width as needed by inserting fill characters at the
end of a generated field (left justification).
oct, to insert or extract integer values in octal format.
45
MC Nicols Quiroz MC Nicols Quiroz
E/S con formato
miembros de la clase ios
right, to pad to a field width as needed by inserting fill characters at
the beginning of a generated field (right justification).
scientific, to insert floating-point values in scientific format (with an
exponent field).
showbase, to insert a prefix that reveals the base of a generated
integer field.
showpoint, to insert a decimal point unconditionally in a generated
floating-point field.
showpos, to insert a plus sign in a non-negative generated numeric
field.
skipws, to skip leading white space before certain extractions.
unitbuf, to flush output after each insertion.
uppercase, to insert uppercase equivalents of lowercase letters in
certain insertions.
MC Nicols Quiroz MC Nicols Quiroz
width
streamsize width() const; streamsize width(streamsize
wide);
46
MC Nicols Quiroz MC Nicols Quiroz
iostream Class Hierarchy Diagram:
MC Nicols Quiroz MC Nicols Quiroz
ostream class
The three most important output stream classes are
ostream, ofstream, and ostrstream.
ostream class:
cout standard output
cerr standard error with limited buffering
clog similar to cerr but with full buffering
47
MC Nicols Quiroz MC Nicols Quiroz
fstream class
open Opens a file and attaches it to the filebuf object and thus to
the stream.
close Flushes any waiting output and closes the streams file.
setbuf Attaches the specified reserve area to the streams filebuf
object.
setmode Sets the streams mode to binary or text.
attach Attaches the stream (through the filebuf object) to an open
file.
Status/Information Public Members
rdbuf Gets the streams filebuf object.
fd Returns the file descriptor associated with the stream.
is_open Tests whether the streams file is open.
MC Nicols Quiroz MC Nicols Quiroz
ifstream::open
void open( const char* szName, int nMode = ios::in, int nProt =
filebuf::openprot );
Parameters
szName
The name of the file to be opened during construction.
nMode
An integer containing bits defined as ios enumerators that can be
combined with the OR ( | ) operator. See the ifstream constructor for
a list of the enumerators. The ios::in mode is implied.
nProt
The file protection specification; defaults to the static integer
filebuf::openprot. See the ifstream constructor for a list of the
other allowed values.
48
MC Nicols Quiroz MC Nicols Quiroz
ifstream::open
nMode
nMode
An integer that contains mode bits defined as ios enumerators
that can be combined with the bitwise OR ( | ) operator.
The nMode parameter must have one of the following
values:
ios::in The file is opened for input (default).
ios::nocreate If the file does not already exist, the function
fails.
ios::binary Opens the file in binary mode (the default is text
mode). Note that the ios::nocreate flag is necessary if you
intend to test for the files existence (the usual case).
MC Nicols Quiroz MC Nicols Quiroz
ifstream::open
nProt
The file protection specification; defaults to the static integer
filebuf::openprot that is equivalent to
filebuf::sh_compat. The possible nProt values are:
filebuf::sh_compat Compatibility share mode.
filebuf::sh_none Exclusive mode no sharing.
filebuf::sh_read Read sharing allowed.
filebuf::sh_write Write sharing allowed. To combine the
filebuf::sh_read and filebuf::sh_write modes, use the
logical OR ( || ) operator.
49
MC Nicols Quiroz MC Nicols Quiroz
ifstream::setmode
int setmode( int nMode = filebuf::text );
Return Value
The previous mode; 1 if the parameter is invalid, the file is
not open, or the mode cannot be changed.
Parameters
nMode
filebuf::text Text mode (newline characters translated to
and from carriage returnlinefeed pairs).
filebuf::binary Binary mode (no translation).
MC Nicols Quiroz MC Nicols Quiroz
ifstream::close
void close();
Remarks
Calls the close member function for the associated filebuf object. This
function, in turn, closes the file and disconnects the file from the
filebuf object. The filebuf object is not destroyed.
The streams error state is cleared unless the call to filebuf::close
fails.
50
MC Nicols Quiroz MC Nicols Quiroz
Referencias
Una referencia es un nombre alternativo (un
sinnimo) para un objeto o variable.
Utilizacin de ambos lados del operador de
asignacin.
tipo& NombreReferencia = objeto;
Ejemplo:
int y = 10;
int& x = y; //x es una referencia de y
Siempre que se declare una referencia debe ser
inicializada, o al menos que se un parmetro de
una funcin no se inicializa.
MC Nicols Quiroz MC Nicols Quiroz
Utilizacin a ambos lados del operador de
asignacin, con referencias
class CReferencia
{
private:
int x;
public:
int& Valor()
{ return x;}
};
void main()
{
CReferencia obj;
int y;
obj.Valor()=10;
y=obj.Valor();
cout<<y<<endl;
}
51
MC Nicols Quiroz MC Nicols Quiroz
Paso de parmetros por Referencia
Dos formas:
1. Pasar la direccin del parmetro actual a su correspondiente
parmetro formal, el cual tiene que ser un apuntador.
2. Declarar el parmetro formal, como una referencia al parmetro
actual que se quiere pasar como referencia.
Clase CFecha
fechas correctas
Objetivos:
Parmetros por omisin
Sobre carga de funciones
funcion(parmetros) const, la funcin no puede
modificar al objeto
Referencias
Manejo de fechas y tiempo (time.h)
Apuntador this
Funciones amigas (friend)
52
MC Nicols Quiroz MC Nicols Quiroz
Clase CFecha
Disear una clase que almacene una fecha, verificando que es
correcta:
dia <1 y das del mes>
mes <1 y 12>
ao 1900
Atributos: dia, mes, anyo
Mtodos Pblicos:
AsignarFecha, permite asignar la fecha
ObtenerFecha, obtiene la fecha de un objeto existente
FechaCorrecta, verifica si la fecha es correcta (true o false)
Mtodos Privados:
Bisiesto, verifica si el ao es bisiesto
Funciones globales:
leerFecha, permite leer la fecha ingresado por el usuario
visualizarFecha, muestra en pantalla la fecha de un objeto (CFecha)
MC Nicols Quiroz MC Nicols Quiroz
Clase CFecha
(fecha.h)
class CFecha
{
// Atributos
private:
int m_dia, m_mes, m_anyo;
// Mtodos
protected:
bool bisiesto() const;
public:
void AsignarFecha(int dd, int mm, int aaaa);
void ObtenerFecha(int *dd, int *mm, int *aaaa) const;
bool FechaCorrecta() const;
};
53
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha, obtenerFecha
(fecha.cpp)
void CFecha::AsignarFecha(int dd, int mm, int aaaa)
{
m_dia = dd;
m_mes = mm;
m_anyo = aaaa;
}
void CFecha::ObtenerFecha(int *dd, int *mm, int *aaaa) const
{
*dd = m_dia; *mm = m_mes; *aaaa = m_anyo;
}
bool CFecha::Bisiesto() const
{
return ((m_anyo % 4 == 0) && (m_anyo % 100 != 0) || (m_anyo % 400 == 0));
}
MC Nicols Quiroz MC Nicols Quiroz
fechaCorrecta (fecha.cpp)
bool CFecha::FechaCorrecta( ) const
{ bool diaCorrecto, mesCorrecto, anyoCorrecto;
anyoCorrecto = (m_anyo >= 1900); // ao correcto?
mesCorrecto = (m_mes >= 1) && (m_mes <= 12); // mes correcto?
switch (m_mes) // da correcto?
{ case 2: if (bisiesto()) //Febrero bisiesto
diaCorrecto = (m_dia >= 1 && m_dia <= 29);
else //Febrero 28 dias
diaCorrecto = (m_dia >= 1 && m_dia <= 28);
break;
case 4: case 6: case 9: case 11: //meses de 30 das
diaCorrecto = (m_dia >= 1 && m_dia <= 30);
break;
default: //meses de 31 das
diaCorrecto = (m_dia >= 1 && m_dia <= 31);
}
return diaCorrecto && mesCorrecto && anyoCorrecto;
}
54
MC Nicols Quiroz MC Nicols Quiroz
Clase CFecha
(fecha.h)
class CFecha
{ // Atributos
private:
int m_dia, m_mes, m_anyo;
// Mtodos
protected:
bool bisiesto() const;
public:
CFecha( ); //constructor sin parmetros
CFecha(int dd, int mm, int aaaa); //constructor con parmetros
void asignarFecha(int dd=1, int mm=1, int aaaa=2000);
void obtenerFecha(int *dd, int *mm, int *aaaa) const;
bool fechaCorrecta() const;
};
Valores por omisin
MC Nicols Quiroz MC Nicols Quiroz
leerFecha y visualizarFecha
(principal.cpp)
void leerFecha(int& dia, int& mes, int& anyo)
{
cout << "da: "; cin >> dia;
cout << "mes: "; cin >> mes;
cout << "anyo: "; cin >> anyo;
}
void visualizarFecha(const CFecha& fecha)
{
int dd, mm, aaaa;
fecha.obtenerFecha(&dd, &mm, &aaaa);
cout << dd << "/" << mm << "/" << aaaa << "\n";
}
55
Mtodos sobrecargados
polimorfismo
Sobrecargar el mtodo
asignarFecha
Para que asigne la fecha
actual
MC Nicols Quiroz MC Nicols Quiroz
Clase CFecha
(fecha.h)
class CFecha
{
// Atributos
private:
int m_dia, m_mes, m_anyo;
// Mtodos
protected:
bool bisiesto() const;
public:
void asignarFecha(int dd, int mm, int aaaa);
void asignarFecha( );
void asignarFecha(int dd);
void obtenerFecha(int *dd, int *mm, int *aaaa) const;
bool fechaCorrecta() const;
};
56
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha
(fecha.cpp)
void CFecha::AsignarFecha()
{ // Asignar por omisin, la fecha actual
struct tm *fh;
time_t segundos;
time(&segundos);
fh = localtime(&segundos);
m_dia = fh->tm_mday;
m_mes = fh->tm_mon;
m_anyo = fh->tm_year+1900;
}
MC Nicols Quiroz MC Nicols Quiroz
Time.h
funcin localtime
tm_sec
Seconds after minute (0 59)
tm_min
Minutes after hour (0 59)
tm_hour
Hours after midnight (0 23)
tm_mday
Day of month (1 31)
tm_mon
Month (0 11; January = 0)
tm_year
Year (current year minus 1900)
tm_wday
Day of week (0 6; Sunday = 0)
tm_yday
Day of year (0 365; January 1 = 0)
57
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha
da, los dems por omisin
void CFecha::AsignarFecha(int dd)
{
AsignarFecha();
m_dia = dd;
}
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha
dia, mes, los dems por omisin
void CFecha::asignarFecha(int dd, int mm, int
aaaa)
{
asignarFecha();
m_dia = dd; m_mes = mm;
}
58
Asignar parmetros por omisin
MC Nicols Quiroz MC Nicols Quiroz
Clase CFecha
(fecha.h)
class CFecha
{
// Atributos
private:
int m_dia, m_mes, m_anyo;
// Mtodos
protected:
bool bisiesto() const;
public:
CFecha(int dd = 1, int mm = 1, int aaaa = 2001); // constructor
~CFecha(){}; // destructor
void asignarFecha(int dd = 0, int mm = 0, int aaaa = 0);
void obtenerFecha(int *dd, int *mm, int *aaaa) const;
bool fechaCorrecta() const;
};
59
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha
(fecha.cpp)
// en la declaracin de clase
void asignarFecha(int dd = 0, int mm = 0, int aaaa = 0);
void CFecha::asignarFecha( int dd, int mm, int aaaa)
{ // Asignar, por omisin, la fecha actual
struct tm *fh;
time_t segundos;
time(&segundos);
fh = localtime(&segundos);
if (dd) m_dia = dd; else m_dia = fh->tm_mday;
if (mm) m_mes = mm; else m_mes = fh->tm_mon;
if (aaaa) m_anyo = aaaa; else m_anyo = fh->tm_year+1900;
}
MC Nicols Quiroz MC Nicols Quiroz
asignarFecha
con parmetros por omisin
void CFecha::asignarFecha(int dd, int mm, int aaaa)
{
// Asignar, por omisin, la fecha actual.
struct tm *fh;
time_t segundos;
time(&segundos);
fh = localtime(&segundos);
if (dd) m_dia = dd; else m_dia = fh->tm_mday;
if (mm) m_mes = mm; else m_mes = fh->tm_mon;
if (aaaa) m_anyo = aaaa; else m_anyo = fh->tm_year+1900;
}
60
MC Nicols Quiroz MC Nicols Quiroz
Apuntador implcito this
CFecha * const this = &fecha;
Apuntador por omisin
Funciones amigas
61
MC Nicols Quiroz MC Nicols Quiroz
Funciones amigas
Declaracin:
friend void asignarFecha();
Una funcin amiga puede tener acceso a los miembros de
una clase.
Una funcin amiga se puede declarar en cualquier parte de
la clase, no le afectan las palabras public, private,
protected, ya que una funcin friend no es miembro de la
clase.
Una funcin puede ser amiga de ms de una clase, lo que
puede conducir a interfaces ms claras.
Una funcin amiga admite que se apliquen a su primer
argumento conversiones implcitas o definidas por el
usuario.
MC Nicols Quiroz MC Nicols Quiroz
Funcin amiga (friend)
void MostrarDatos(CFecha& obj)
{
cout<<endl<<obj.m_dia<<"/ "<<obj.m_mes<<"/
"<<obj.m_anyo<<endl;
}
classCFecha
{
int m_dia, m_mes, m_anyo;
friend void MostrarDatos(CFecha& );
public:
//mtodos miembro
};
62
MC Nicols Quiroz MC Nicols Quiroz
Funciones amigas
class C1; //declaracin adelantada C1
class C2
{
private:
int nc2;
public:
void AsignarDato(int n) {nc2 = n; }
int ObtenerDato(const C1& );
};
class C1
{
friend int C2::ObtenerDato(const C1& );
private:
int nc1;
public:
void AsignarDato(int n) {nc1 = n;}
};
int C2::ObtenerDato(const C1& obj)
{
return obj.nc1 + nc2; //sumar dos objetos de clases diferentes
}
Tambin es posible declarar
un mtodo de una clase C2
amiga de otra clase C1.
MC Nicols Quiroz MC Nicols Quiroz
Funciones amigas
Cuando se requiere que todos los mtodos de una
clase C1 sean amigos de otra clase C2. Para
permitir esto, hay que declarar la clase C1 amiga
de la clase C2.
classC1
{
//miembros
};
classC2
{
friendclassC1;
// miembros
};
63
MC Nicols Quiroz MC Nicols Quiroz
clase amiga
class C1
{
// miembros
};
class C2
{
friend class C1;
//miembros
};
Clases
MC Nicols Quiroz
Objetivos:
Evitar compilacin duplicada de archivos de cabecera
Declaracin de objetos dentro de otra clase
Manejo de excepciones (try, catch)
Memoria dinmica (new, delete)
Miembros estticos (static)
64
MC Nicols Quiroz MC Nicols Quiroz
Syntax defined
defined(Identificador)
Esta expresin constante es considerada verdadera
(no cero) si el Identificador esta actualmente
definido; en cualquier otro caso la condicin es
falsa (0). Un identificador definido como texto
vaci es considerado definido. La directiva
defined puede ser usada en una directiva #if y
en una #elif.
MC Nicols Quiroz MC Nicols Quiroz
Evitar compilacin doble
A common use for conditional compilation is to prevent multiple
inclusions of the same header file. In C++, where classes are often
defined in header files, constructs like the following can be used to
prevent multiple definitions:
// EXAMPLE.H - Example header file
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example {
...
};
#endif // !defined( EXAMPLE_H )
65
MC Nicols Quiroz MC Nicols Quiroz
Clase Persona
persona.h
class CPersona
{
private:
char *m_Nombre;
CFecha m_fecha_nacimiento; // objeto CFecha
long m_telefono;
protected:
char *asignarCadena(char *);
public:
CPersona(char * = 0,int = 1,int = 1,int = 2001,long = 0);
~CPersona() { delete [] m_Nombre; }
void asignarNombre(char *);
char *obtenerNombre(char *);
//char* obtenerNombre() { return m_Nombre; }
CFecha& fechaNacimiento() { return m_fecha_nacimiento; }
void asignarTelefono(long);
long obtenerTelefono();
};
MC Nicols Quiroz MC Nicols Quiroz
constructor
CPersona::CPersona(char *nom, int dd, int mm, int aa, long tel):
m_fecha_nacimiento(dd, mm, aa), m_telefono(tel)
{
m_Nombre = asignarCadena(nom);
}
void CPersona::asignarNombre(char *nom)
{
delete [] m_Nombre;
m_Nombre = asignarCadena(nom);
}
66
MC Nicols Quiroz MC Nicols Quiroz
asignarCadena
(persona.cpp)
char *CPersona::asignarCadena(char *pcad)
{
char *pcadena;
if (pcad == NULL) return NULL;
try
{
pcadena = new char[strlen(pcad) + 1];
}
catch(bad_alloc e)
{
cout << "Insuficiente espacio de memoria\n";
exit(-1);
}
strcpy(pcadena, pcad);
return pcadena;
}
MC Nicols Quiroz MC Nicols Quiroz
Excepciones
Las excepciones son el medio que tiene C++ para separar la
notificacin de un error del tratamiento del mismo.
Si el cdigo puede lanzar una excepcin se encierra en un
bloque try, y se atrapa y maneja en un bloque catch.
//
try
{
//cdigo que puede lanzar una excepcin
}
catch(excepcin)
{
//manejo de la excepcin
}
67
MC Nicols Quiroz MC Nicols Quiroz
Mtodo global
(principal.cpp)
void visualizar(CPersona& persona)
{
int dia, mes, anyo;
char nombre[80];
persona.fechaNacimiento().obtenerFecha(&dia, &mes, &anyo);
cout << persona.obtenerNombre(nombre) << endl
<< dia << "/" << mes << "/" << anyo << endl
<< persona.obtenerTelefono() << endl;
}
MC Nicols Quiroz MC Nicols Quiroz
Miembros estticos (static)
Cuando se desea disponer de una variable global
pblicamente accesible que no sea parte del
objeto, pero si de la clase, o bien un mtodo que
no necesite ser invocado para un objeto en
particular. Esta funcionalidad se da a travs de
miembros estticos.
Las variables miembro static se caracterizan por
ser propias de la clase y no de cada objeto.
68
MC Nicols Quiroz MC Nicols Quiroz
CFecha A(4,1,2000), B, C(12,3,2008)
da= 4
mes= 1
ao= 2000
A
da= 1
mes= 1
ao= 2001
B da= 12
mes= 3
ao= 2008
C
obtenerFecha()
asignarFecha()
fechaPorOmision(1,1,2000)

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();
}

Вам также может понравиться