Anda di halaman 1dari 114

ESCUELA TCNICA SUPERIOR DE

INGENIERA INFORMTICA
DEPARTAMENTO DE CIENCIAS
DE LA COMPUTACIN
Introduccin al lenguaje C++
PROGRAMACIN C++
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo






PROGRAMACIN C++
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo






PROGRAMACIN C++
Orgenes del lenguaje
Diseado por B. Stroustrup de AT&T en 1983
Extensin del lenguaje C con soporte para la POO
Mantiene riqueza de operadores, flexibilidad y
eficiencia de su antecesor
The C++ Programming Language [Stroustrup 1985]
En 1989, ANSI e ISO conforman dos comits para
estandarizar el lenguaje.

INTRODUCCIN AL LENGUAJE C++
Orgenes del lenguaje
Diseado por B. Stroustrup de AT&T en 1983
1998 estndar original del lenguaje C++98
ISO/IEC 14882
2003 revisin menor C++03 (ISO/IEC 14882:2003)
2011 nuevo estndar C++11 (ISO/IEC 14882:2011)
Expresiones lambda, deduccin automtica de tipos, inicializacin uniforme,
referencias rvalue, constructores delegados, soporte para programacin
concurrente, expresiones regulares, nuevos algoritmos y contenedores
genricos, etc.


INTRODUCCIN AL LENGUAJE C++
Orgenes del lenguaje
No se trata de un lenguaje orientado a objetos puro
Soporta programacin imperativa
C++ mantiene compatibilidad casi completa con C






INTRODUCCIN AL LENGUAJE C++
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo







PROGRAMACIN C++
Diferencias con respecto a C
Extensin .cpp
Librera estndar de C++




Tambin incorpora la librera estndar de C

INTRODUCCIN AL LENGUAJE C++
Containers
<array> <bitset> <deque> <list> <map> <queue>
<set> <stack> <unordered_map> <unordered_set>
<forward_list> <vector>
General
<algorithm> <functional> <iterator> <locale>
<tuple> <memory> <stdexcept> <utility>
Strings
<string>
Streams
<fstream> <iomanip> <ios> <iosfwd> <iostream>
<istream> <ostream> <sstream> <streambuf>
Numerics
<complex> <numeric> <valarray>
Language
<exception> <limits> <new> <typeinfo>
Definida bajo el espacio de nombres std
Diferencias con respecto a C
Extensin .cpp
Librera estndar de C++
Tambin incorpora la librera estndar de C

INTRODUCCIN AL LENGUAJE C++
Librera estndar de C
assert.h complex.h ctype.h errno.h
fenv.h float.h inttypes.h iso646.h
limits.h locale.h math.h setjmp.h
signal.h stdarg.h stdbool.h stdef.h
stdint.h stdio.h stdlib.h string.h
tgmath.h time.h wchar.h wctype.h
#include <cstdio>

#include <stdio.h>

Diferencias con respecto a C
Conversiones explicitas de tipo (casting)



Ejemplos


INTRODUCCIN AL LENGUAJE C++
(tipo) expresion
static_cast<tipo> (expresion)


tipo (expresion)


int z = int (x/y);
int z = static_cast<int> (x/y);


int z = (int)(x/y);
Diferencias con respecto a C
Funciones inline
Macros con parmetros: eficientes pero propensas
a introducir errores


Alternativa propuesta en C++ funciones inline
INTRODUCCIN AL LENGUAJE C++
inline unsigned char getPixel (Timage* image, int x, int y){
return image->data[x][y]
}
#define getPixel(image, x, y) image->data[x][y]
Diferencias con respecto a C





INTRODUCCIN AL LENGUAJE C++
inline double cube (double a){
return a*a*a;
}
#define cube (a) a*a*a

El uso de inline no implica que el
compilador trate la funcin como tal
double c = cube (2.5 + 1.5);

double c = cube (2.5 + 1.5);

double c = 2.5 + 1.5 * 2.5 +
1.5 * 2.5 + 1.5 ;

double c = 4 * 4 *4;

cdigo a compilar cdigo a compilar
Diferencias con respecto a C
Sobrecarga de funciones
No admite funciones que slo se diferencien en el
tipo de dato devuelto
Ejemplo:
INTRODUCCIN AL LENGUAJE C++
char* append ( const char* str1, const char* str2);
char* append ( const char* str1, const char* str2, size_t n );
char* append ( const char* str1, const char* str2, size_t pos,
size_t n );
Diferencias con respecto a C
Valores por defecto en una funcin
Si en la llamada no se especifica valor para un
parmetro, ste tomar el establecido por defecto
Un parmetro con valor por defecto, no pueden ir
seguido de parmetros sin valor por defecto
INTRODUCCIN AL LENGUAJE C++
double pow ( double base, double exponent = 2);
double pow5 = pow ( x, 5);
double pow2 = pow ( x );

Diferencias con respecto a C
Referencias
Nuevo tipo de dato
Permite definir alias de variables ya existentes



INTRODUCCIN AL LENGUAJE C++
tipoDato& idVariable = variable;
int x = 3;
int& refX = x;

refX++;
x++;
cout <<refX<< " = " << x;
Una referencia se ha de inicializar en su declaracin, mantenindose
como alias de la misma variable hasta su destruccin
Diferencias con respecto a C
Referencias
Utilidad?: paso por referencia
En C



INTRODUCCIN AL LENGUAJE C++
int value1, value2;

permute(&value1, &value2);
void permute(int* pvalue1, int* pvalue2){
int temp;
temp = *pvalue1;
*pvalue1 = *pvalue2;
*pvalue2 = temp;
}
Diferencias con respecto a C
Referencias
Utilidad?: paso por referencia
En C++



INTRODUCCIN AL LENGUAJE C++
int v1, v2;

permute(v1, v2);
void permute(int& value1, int& value2){
int temp;
temp = value1;
value1 = value2;
value2 = temp;
}
Diferencias con respecto a C
Referencias
Otra utilidad?: paso por valor eficiente
Se evita tener que hacer una copia para trabajar
dentro de la funcin

INTRODUCCIN AL LENGUAJE C++
Tsong myFavouriteSong = mostPlayedSong();
showInfoSong (myFavouriteSong);
void showInfoSong(const TSong& song) {

}
struct TSong{
char title [256];
char artist [256];
int length;
char album [256];
TDate modifiedDate;
TUser user;
};
Diferencias con respecto a C
Gestin de memoria dinmica
Operador new y delete
INTRODUCCIN AL LENGUAJE C++
int* pInt = (int*) malloc (sizeof(int));
int* pNInts = (int*) malloc (sizeof(int)*n);

free (pInt);
free (pNInts);
C
int* pInt = new int;
int* pNInts = new int[n];

delete pInt;
delete [] pNInts;
C++
Diferencias con respecto a C
Entrada/Salida estndar
Operador de insercin <<
escritura en un flujo de datos
Operador de extraccin >>
lectura de un flujo de datos
Flujos de datos asociados a dispositivos de E/S
estndar (<iostream>)
cout
cin
INTRODUCCIN AL LENGUAJE C++
Diferencias con respecto a C
INTRODUCCIN AL LENGUAJE C++
cout << "Introduzca una fecha para el suceso:\n"
cin >> dia >> mes >> anyo;

cout << "El resultado es: " << result << endl;


Entrada/Salida estndar
Los operadores de insercin y extraccin estn
sobrecargados
Pueden utilizarse con cualquier tipo definido por el
lenguaje
Los operadores de insercin y extraccin soportan concatenacin
Diferencias con respecto a C
INTRODUCCIN AL LENGUAJE C++
#include <iostream>

int main() {
std::cout << "!!!Hello World!!!" << std::endl;
return 0;
}
#include <stdio.h>

int main() {
printf("!!!Hello World!!!\n");
return 0;
}
C
C++
Ejercicio 1
INTRODUCCIN AL LENGUAJE C++
Instalacin / configuracin del entorno de
desarrollo
EclipseGavab (aulas)
Eclipse CDT (CDT 7.0.2 for Eclipse Helios)
Diseo de un TAD Imagen en C++
Enunciado
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo






PROGRAMACIN C++
E/S en C++ - Streams
Al igual que en C, la E/S se encuentra definida
fuera del lenguaje
C++ hereda la librera estndar de C
Es posible utilizar esta librera para realizar operaciones
de E/S en C++ <cstdio>
La librera estndar de C++ define una nueva
forma de llevar a cabo este tipo de operaciones
Al igual que en C, la E/S va ligada al concepto de stream
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Streams
C++ encapsula el comportamiento de los flujos de
datos en una jerarqua de clases
Streams predefinidos:
cin
objeto istream
cout,cerr,clog
objetos ostream
INTRODUCCIN AL LENGUAJE C++
ios

istream

ostream

iostream

E/S en C++ - con/sin formato
Se distinguen entre dos conjuntos de operaciones
de E/S
Sin formato
Leen la informacin del stream tal cual es proporcionada
por este
Escriben los datos en un stream tal cual se encuentran
almacenados en memoria
Con formato
Llevan acabo algn tipo de modificacin sobre los datos
despus de leerlos o antes de escribirlos en un stream
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - con/sin formato
Operaciones de E/S con formato
Entrada (mtodos de la clase istream)
Mtodos operator>> sobrecargados en la clase
istream
Salida (mtodos de la clase ostream)
Mtodos operator<< sobrecargados en la clase
ostream
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - con/sin formato
Operaciones E/S sin formato
Salida (mtodos de la clase ostream)



Entrada (mtodos de la clase istream)
INTRODUCCIN AL LENGUAJE C++
ostream& put ( char c );
ostream& write ( const char* s , streamsize n );


int get();
istream& get ( char* s, streamsize n, char delim );
istream& getline (char* s, streamsize n, char delim );
istream& read ( char* s, streamsize n );
Leen n-1 caracteres!!!
E/S en C++ - Manipuladores de flujo
Permiten modificar la configuracin del formato de la
salida
Base integral
Precisin
Anchura de campos
Alineacin
Dos tipos:
sin parmetros
con parmetros: definidos en <iomanip>
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manipuladores de flujo
Base integral
Permiten modificar la forma en que se visualizarn los
valores enteros
dec (por defecto), hex, oct
setbase (base)
Una vez se modifica la base de un flujo, todos los valores
enteros se procesan utilizando esa base.
showbase: obliga a que se imprima la base de un valor
entero (0 o 0x)
Es persistente
Para anularlo se usa el manipulador noshowbase
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manipuladores de flujo
Precisin
Permiten modificar el formato de salida de los nmero
reales
scientific, fixed
Si no se utiliza un manipulador, el valor del nmero
determina el formato de salida
Permiten modificar el nmero de decimales a mostrar:
setprecision (numDecimales)
La clase ostream presenta tambin un mtodo para este
propsito cout.precision(4)
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manipuladores de flujo
Anchura de campos
Permiten modificar el nmero de caracteres en los que debe
imprimirse un valor
setw(numCaracteres)
Si el valor mostrado tiene una anchura menor se insertan
caracteres de relleno
El espacio es el carcter de relleno por defecto
setfill(caracter): cambia el carcter de relleno
La clase ostream presenta tambin mtodos para este
propsito: cout.width(5), cout.fill(#)




INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manipuladores de flujo
Alineacin
Permiten justificar el valor a imprimir dentro del ancho
especificado
left
right (por defecto)
internal
el signo del nmero a imprimir se alinea a la izquierda
su valor a la derecha
los espacios intermedios se rellenan con el carcter de relleno
showpos obliga a que se muestre el signo + delante de los
valores positivos
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manejo de ficheros
La librera estndar de C++ define 3 clases para el
manejo de ficheros
ifstream
flujos de datos de entrada asociados a un fichero
ofstream
flujos de datos de salida asociados a un fichero
fstream
flujos de datos de entrada y/o salida asociados a un fichero
Todas ellas se encuentran definidas en el fichero de
cabecera <fstream>
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manejo de ficheros
Las nuevas clases son especializaciones de las clases
ya existentes para definir flujos de datos
INTRODUCCIN AL LENGUAJE C++
Heredaran los mtodos de las clases padres
Un objeto ifstream podr invocar los mtodos
definidos en la clase istream:
operator>>(), get(), getline(),
read()
Un objeto ofstream podr invocar los mtodos
en la clase ostream:
operator<<(), put()
ios

istream

ostream

iostream

ifstream

fstream

ofstream

E/S en C++ - Manejo de ficheros
Lectura de un fichero
Crear un objeto ifstream



Leer informacin del fichero
Mtodos: operator>>(), getline(), get(), read()
Desasociar el fichero del flujo de datos



INTRODUCCIN AL LENGUAJE C++
ifstream in ("fichero.txt");
ifstream in; in.open("fichero.txt");
in.close();
Por defecto en modo lectura
Se har de forma implcita
cuando se destruya el
objeto ifstream creado
E/S en C++ - Manejo de ficheros
Escritura en un fichero
Crear un objeto ofstream



Escribir informacin en el fichero
Mtodos: operator<<(), put(), write()
Desasociar el fichero del flujo de datos



INTRODUCCIN AL LENGUAJE C++
ofstream out ("fichero.txt");
ofstream out; out.open("fichero.txt");
out.close();
Por defecto en modo escritura
Se har de forma implcita
cuando se destruya el
objeto ofstream creado
E/S en C++ - Manejo de ficheros
Es posible introducir modificaciones en el modo
de apertura por defecto:



Ejemplos



INTRODUCCIN AL LENGUAJE C++
ios::app abre un fichero en modo escritura. La informacin se escribe al final de ste.
ios::out abre un fichero en modo escritura
ios::in abre un fichero en modo lectura
ios::binary abre un fichero en modo binario
ofstream out("fichero.txt",ios::app);
ofstream out("fichero",ios::app | ios::binary);
ifstream in("fichero.txt",ios::in); //== ifstream in("fichero.txt");

E/S en C++ - Manejo de ficheros
Acceso aleatorio
Para flujos de entrada asociados a un fichero
seekg(desplazamiento, origen)
tellg()
Para flujos de salida asociados a un fichero
seekp(desplazamiento, origen)
tellp()
Origen:
ios::beg, ios::cur, ios::end
Mtodos eof(),is_open()
INTRODUCCIN AL LENGUAJE C++
E/S en C++ - Manejo de ficheros
INTRODUCCIN AL LENGUAJE C++
<istream> <iostream> <fstream> <sstream> <ios>
ios

ios_base

<ostream>
<streambuf>
iostream

istream
streambuf

ostream

cin:istream

err:ostream

fstream

ifstream

filebuf

ofstream

stringstream
istringstream
stringbuf

ostringstream

cout:ostream
clog:ostream

Vista simplificada de la IOstream Library
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo







PROGRAMACIN C++
Declaracin de una clase en C++
INTRODUCCIN AL LENGUAJE C++
#ifndef NOMBRECLASE_H_
#define NOMBRECLASE_H_

class NombreClase {

public:
// Cabeceras de los mtodos pblicos

private:
// Declaracin de los atributos
// Cabecera de los mtodos privados
};
#endif
NombreClase.h
POO con C++ - Clase
POO con C++ - Clase
Declaracin de una clase en C++
INTRODUCCIN AL LENGUAJE C++
#include "NombreClase.h"

/*Implementacin de todos los mtodos, pblicos y
privados*/
NombreClase.cpp
Diferenciamos dos partes:
Vista pblica
Vista privada
Vista pblica
Tambin conocida como interfaz de la clase
Nombre de la clase + cabeceras de mtodos
En C++ se declaran en el fichero cabecera .h bajo el
especificador de acceso public


INTRODUCCIN AL LENGUAJE C++
POO con C++ - Clase
Vista pblica

INTRODUCCIN AL LENGUAJE C++
NombreClase.h
#ifndef NOMBRECLASE_H_
#define NOMBRECLASE_H_

class NombreClase {

public:
// Cabeceras de los mtodos pblicos

private:
// Declaracin de los atributos
// Cabecera de los mtodos privados
};
#endif

POO con C++ - Clase
Ejercicio 2
Definir la vista pblica de una clase Complejo
en C++ que presente la siguiente funcionalidad:
Calcular el mdulo de un complejo
Comprobar si un complejo es igual a otro
Sumar un complejo a otro
Convertir un nmero complejo en una cadena


INTRODUCCIN AL LENGUAJE C++
Ejercicio 2 (solucin)
INTRODUCCIN AL LENGUAJE C++
Complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
#include <string>

class Complex {
public:

double abs ()const;
Complex add(const Complex& complex)const;
bool equals (const Complex& complex)const;
std::string toString()const;

private:

};
#endif /* COMPLEX_H_ */
Ejercicio 2 (solucin)
INTRODUCCIN AL LENGUAJE C++
Complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
#include <string>

class Complex {
public:

double abs ()const;
Complex add(const Complex& complex)const;
bool equals (const Complex& complex)const;
std::string toString()const;

private:

};
#endif /* COMPLEX_H_ */
mtodos const no modifican el estado del objeto
Ejercicio 2 (solucin)
INTRODUCCIN AL LENGUAJE C++
Complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
#include <string>

class Complex {
public:

double abs ()const;
Complex add(const Complex& complex)const;
bool equals (const Complex& complex)const;
std::string toString()const;

private:

};
#endif /* COMPLEX_H_ */
Referencias constantes para evitar copias
en paso por valor
Ejercicio 2 (solucin)
INTRODUCCIN AL LENGUAJE C++
Complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
#include <string>

class Complex {
public:

double abs ()const;
Complex add(const Complex& complex)const;
bool equals (const Complex& complex)const;
std::string toString()const;

private:

};
#endif /* COMPLEX_H_ */
Identificadores de la librera estndar de
C++ definidos bajo el namespace std
Vista pblica
Tambin forman parte de la interfaz de una clase los
constructores
Un constructor es un mtodo especfico que sirve para
inicializar los objetos de una clase
Los constructores en C++:
Se definen con el mismo nombre que la clase
Pueden recibir parmetros de entrada
No presentan tipo de retorno
La sobrecarga permite definir mas de un constructor
Distintos tipos: por defecto, de oficio, copia
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Clase
INTRODUCCIN AL LENGUAJE C++
Complex.h
#ifndef COMPLEX_H_
#define COMPLEX_H_
#include <string>

class Complex {
public:
Complex();
Complex(double realPart, double imaginaryPart);

double abs ()const;
Complex add(const Complex& complex)const;
bool equals (const Complex& complex)const;
std::string toString()const;

private:

};
#endif /* COMPLEX_H_ */
POO con C++ - Clase
Vista pblica
La declaracin de un objeto trae consigo una llamada a un
constructor de la clase
INTRODUCCIN AL LENGUAJE C++
main.cpp
#include "iostream"
#include "Complex.h"

int main(){
Complex complex1;
Complex complex2(3.0,2.0);

std::cout<<"El modulo del complejo ";
std::cout<<complex2.toString();

std::cout<<" es "<<complex2.abs();
return 0;
}

Lanzamiento de mensajes
al objeto complex2 de la
clase Complex
Declaracin de un objeto
de la clase Complex
POO con C++ - Clase
Vista privada
Presenta la informacin que ha de quedar oculta para el
resto de las clases que intervienen en el programa
Definicin de los atributos de la clase
Cdigo de los mtodos declarados en la interfaz pblica
Declaracin e implementacin de aquellos mtodos que no
formen parte de la vista pblica de la clase (mtodos privados)
En C++, los atributos y las cabeceras de los mtodos
privados se declaran en el fichero .h. bajo el especificador
private
Y la implementacin de los mtodos en el fichero .cpp.

INTRODUCCIN AL LENGUAJE C++
POO con C++ - Clase
INTRODUCCIN AL LENGUAJE C++
#ifndef NOMBRECLASE_H_
#define NOMBRECLASE_H_

class NombreClase {
public:

private:
// Declaracin de los atributos
// Cabecera de los mtodos privados
};
#endif
NombreClase.h
#include "NombreClase.h"

/*Implementacin de todos los mtodos, pblicos y
privados*/
NombreClase.cpp
POO con C++ - Clase
Ejercicio 2 (cont.)
Definir en C++ la vista privada de la clase Complex cuya
interfaz pblica fue previamente definida
Aadir el siguiente comportamiento a la clase:
Consultar la parte real e imaginaria
Clculo del ngulo/fase/argumento
Clculo del complejo conjugado
Clculo del complejo recproco
Resta, multiplicacin y divisin
Implementar un programa que compruebe el correcto
funcionamiento de la clase definida


INTRODUCCIN AL LENGUAJE C++
class Image{
public:
Image();
Image(unsigned int width, unsigned int height,
unsigned char defaultIntensityValue = 0);
//~Image();

unsigned int getWidth();
unsigned int getHeight();

Image computeIntegral();

bool loadFromPGM(string fileName);
bool savePGM(string fileName);

private:
//...
};
Ejercicio 3
INTRODUCCIN AL LENGUAJE C++
Programar el Ejercicio 1
en C++ de verdad
Un constructor es un mtodo especfico que sirve para
inicializar los objetos de una clase
Declaracin

Se definen con el mismo nombre que la clase
Pueden recibir parmetros de entrada
No presentan tipo de retorno
La sobrecarga permite definir mas de un constructor
La declaracin de un objeto implica la llamada a un
constructor
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Constructores
IdentificadorClase (listaParametros);
nombreClase idObjeto (listaParametros);
Constructor por defecto
Constructor que puede ser invocado sin argumentos


Constructor de oficio
En C++ es posible declarar una clase sin constructor
El compilador se encarga de definir uno constructor de oficio
Se reserva memoria para cada uno de los atributos que presenta
el objeto, pero no se les asigna valor
Los atributos presentan valores basura
INTRODUCCIN AL LENGUAJE C++
Punto();
Punto (int x=0, int y=0);
POO con C++ - Constructores
Constructor de copia
Permiten inicializar un objeto de una clase a partir de otro objeto
de esa clase ya existente
El nuevo objeto presentar el mismo valor en sus atributos que el
objeto original
Declaracin

Llamada
INTRODUCCIN AL LENGUAJE C++
NombreClase (const nombreClase& idObjetoOrigen);
NombreClase idObjeto(idObjetoOrigen);
POO con C++ - Constructores
Constructor de copia de oficio
Para poder inicializar un objeto a partir de otro ya existente, no es
necesario definirse constructor de copia
Si una clase no presenta constructor de copia, el compilador
define uno de oficio
Este constructor lleva a cabo la copia byte a byte del valor de cada
uno de los atributos del objeto origen en el objeto destino
Hay veces en las que este constructor de copia es suficiente
(Complex), pero hay otras en las que no (Image)
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Constructores
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Constructores
#include <cstdio>
#include "Image.h"

int main(){
setvbuf(stdout, NULL, _IONBF, 0);

Image image;
image.loadFromPGM("./3-CopiaOficio/image.pgm");

Image imageCopy(image);
imageCopy.drawQuad(10, 10, 100, 255);

imageCopy.savePGM("./3-CopiaOficio/PaintedImage.pgm");
image.savePGM("./3-CopiaOficio/OriginalImage.pgm");

return 0;
}
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Constructores
#include <cstdio>
#include "Image.h"

int main(){
setvbuf(stdout, NULL, _IONBF, 0);

Image image;
image.loadFromPGM("./3-CopiaOficio/image.pgm");

Image imageCopy(image);
imageCopy.drawQuad(10, 10, 100, 255);

imageCopy.savePGM("./3-CopiaOficio/PaintedImage.pgm");
image.savePGM("./3-CopiaOficio/OriginalImage.pgm");

return 0;
}
Comportamiento esperado
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Constructores
#include <cstdio>
#include "Image.h"

int main(){
setvbuf(stdout, NULL, _IONBF, 0);

Image image;
image.loadFromPGM("./3-CopiaOficio/image.pgm");

Image imageCopy(image);
imageCopy.drawQuad(10, 10, 100, 255);

imageCopy.savePGM("./3-CopiaOficio/PaintedImage.pgm");
image.savePGM("./3-CopiaOficio/OriginalImage.pgm");

return 0;
}
Comportamiento obtenido!!!
Constructor de oficio no es suficiente. Por qu?
POO con C++ - Destructores
Destructores
Mtodos especficos que son invocados automticamente
cuando se libera la memoria asociada a un objeto
Especficos:
Presentan el mismo nombre que la clase precedidos del smbolo ~
No presentan tipo de retorno
No reciben parmetros, por lo que slo deberemos tener uno por
clase
Declaracin:
INTRODUCCIN AL LENGUAJE C++
~ identificadorClase();
POO con C++ - Destructores
Destructores
Funcin:
Liberar recursos que hayan sido reservados durante el tiempo de vida
del objeto
Memoria dinmica, ficheros, conexiones con BBDD,
Si la clase no define destructor el compilador proporciona uno de
oficio
Hay veces en las que este destructor de oficio es suficiente, pero
hay otras que no
Ejemplo: clase Image


INTRODUCCIN AL LENGUAJE C++
POO con C++ - Objetos en memoria dinmica
Reserva de memoria
El operador new se utiliza en C++ para
Reservar memoria dinmica con el fin de almacenar un valor (o valores) de
un determinado tipo
Reservar memoria dinmica para uno o varios objetos de una clase




La llamada a new reserva la memoria necesaria e inicializa cada objeto
creado llamando al constructor especificado


INTRODUCCIN AL LENGUAJE C++
NombreClase* idPAObjeto = new NombreClase;
NombreClase* idPAObjeto = new NombreClase (params);
NombreClase* idPAObjeto = new NombreClase [size];
POO con C++ - Objetos en memoria dinmica
Reserva de memoria
new devuelve un puntero a un objeto de la clase especificada en su
llamada
Con el puntero devuelto por new, es posible invocar mtodos sobre el
objeto definido en memoria dinmica utilizando el operador



INTRODUCCIN AL LENGUAJE C++
Complex* complex = new Complex(3.0, 2.0);
Complex result = complex->add(complex->reciprocal());
POO con C++ - Objetos en memoria dinmica
Liberacin de la memoria
En C++ al igual que en C es el programador el encargado de liberar la
memoria dinmica reservada cuando ya no es necesaria
La memoria reservada por new para almacenar un objeto se libera con el
operador delete



La llamada a delete implica una llamada implcita al destructor antes
de que se libere la memoria
INTRODUCCIN AL LENGUAJE C++
delete idPaObjeto;
delete [] idPaObjetos;
Ejercicio 3 (continuacin)
Aade un destructor a tu clase Image
Aade un constructor de copia a tu clase Image
Aade a tu clase Image un mtodo que permita calcular los
diferentes niveles de resolucin de una imagen:
Image** ComputeResolutionLevels ();
Qu es un nivel de resolucin?
Encuentra la explicacin en el moodle de la asignatura
INTRODUCCIN AL LENGUAJE C++
Variable puntero predefinida accesible dentro de todo
mtodo (excepto estticos)
Guarda la direccin de memoria del objeto sobre el que se
invoco el mtodo
Ejemplos de uso
Poder lanzar mensajes dentro de un mtodo a otro objeto, y pasar el
objeto sobre el que se invoco el mtodo como argumento
Poder definir mtodos que devuelvan como valor de retorno el
objeto sobre el que se invoc el mtodo
sobrecarga del operador =
INTRODUCCIN AL LENGUAJE C++
POO con C++ - this
C++ permite la sobrecarga de operadores para poder operar con
los objetos de una clase


No todos los operadores se pueden sobrecargar
Operadores que no admiten sobrecarga: . :: ?: #
Se mantiene:
Nmero de operandos que ha de recibir el operador
Reglas de precedencia
Reglas de asociatividad


INTRODUCCIN AL LENGUAJE C++
POO con C++ - Sobrecarga operadores
tipoRetorno operator@ (listaParametros);
// @ smbolo del operador (+,-,=,<<,...)
Ejercicio 4
Definir una clase Matrix en C++ que permita trabajar con
matrices algebraicas de un modo ms directo e intuitivo
(estilo MATLAB):
Utilizar los operadores aritmticos (+, -, *) para realizar la
suma, resta, multiplicacin entre dos objetos Matrix
Utilizar los operadores relacionales (==, !=) para comparar dos
objetos Matrix
Utilizar el operador de asignacin para copiar un objeto Matrix
en lugar de tener que hacer uso repetido de la funcin memcpy
Utilizar el operador () para consultar/actualizar una posicin
concreta dentro de la matriz


INTRODUCCIN AL LENGUAJE C++
POO con C++ - Lista de inicializadores
C++ proporciona una manera de inicializar los
atributos fuera del cuerpo del constructor


Se pueden utilizar para inicializar cualquier tipo de
atributo
Los atributos se inicializan en el orden en que
fueron declarados en la clase

INTRODUCCIN AL LENGUAJE C++
Constructor (listaArg): listaInicializadores{

}
POO con C++ - Lista de inicializadores
INTRODUCCIN AL LENGUAJE C++
class Date{
public:
Date(unsigned day, unsigned month, unsigned year);

Date operator+(int days)const;
Date operator-(int days)const;
long operator-(const Date& date)const;

private:
unsigned day, month , year;
}
Date::Date(unsigned day, unsigned month, unsigned year):
day(day), month(month), year(year){
}

Date.h
Date.cpp
POO con C++ - Lista de inicializadores
Y si tengo atributos que son a su vez objetos de
otra/s clases?
Si la instanciacin es esttica:
la creacin de un objeto de la clase todo implica la
creacin de un objeto de la clase parte
se invoca el constructor por defecto de la clase parte antes de
ejecutar el constructor de la clase todo
Y si no tiene?, puedo hacer que se ejecute otro
constructor distinto?
Si, la solucin pasa por el uso de listas de inicializacin
Ejemplo clase Student

INTRODUCCIN AL LENGUAJE C++
POO con C++ - Atributos static
No son atributos especficos de un objeto, sino atributos de clase
Slo se reserva una vez memoria para ese atributo a lo largo de la
ejecucin del programa
Por tanto un atributo static existe incluso antes de crear un
objeto de la clase que lo define
Entre otras cosas, suelen utilizarse para definir constantes
relacionadas con el concepto representado por la clase
Publicas
si tiene sentido el uso de esa constante fuera de la clase
Privadas:
si tiene sentido el uso de esa constante nicamente dentro de la clase
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Atributos static
En C++
Se declaran en el fichero .h
Precedidos de la palabra reservada static
La definicin de estos atributos debe hacerse a nivel
global
Normalmente en el fichero .cpp de la clase
Si se declaran pblicos, es posible acceder a ellos desde
fuera de la clase
utilizando el operador de resolucin precedido del nombre
de la clase donde se definieron
INTRODUCCIN AL LENGUAJE C++
POO con C++ - Mtodos static
Permiten encapsular cierto comportamiento relacionado
con el concepto representado por la clase
Comportamiento que debera poder ser llamado sin
necesidad de tener que crea un objeto de la clase para ello
Ejemplo: comprobar si una cadena almacena una fecha y si lo
hace en el formato correcto
Dentro de ellos slo se tiene acceso a los atributos estticos
En C++
Vienen precedidos del especificador static (slo en el .h)
Si son pblicos, se invocan utilizando el operador de resolucin
precedido del nombre de la clase donde se definieron
INTRODUCCIN AL LENGUAJE C++
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo






PROGRAMACIN C++
Herencia
Relacin binaria se establece entre dos clases
Implica la transmisin de la vista pblica (mtodos pblicos)
y privada (atributos y mtodos privados) de una clase padre
a una clase hija



INTRODUCCIN AL LENGUAJE C++
Clase Padre / Clase Base /Superclase
Clase Hija / Clase Derivada /Subclase
hereda de
Sintxis C++
Padre
Hija
class Padre {

};
class Hija: public Padre {

};
Herencia
Una relacin de herencia implica:
Transmisin
Especializacin

Formas de especializacin
Adicin
De atributos
De mtodos
Redefinicin
INTRODUCCIN AL LENGUAJE C++
Point
ColoredPoint
AutoColoredPoint
Herencia
Adicin de atributos
Aadir nuevos atributos a los heredados de la clase
padre
Los nuevos atributos de la clase hija debern ser
inicializados
Donde?: en su constructor
La llamada a un constructor de la clase hija implica
la llamada al constructor de su clase padre
Finalidad: inicializar los atributos heredados

INTRODUCCIN AL LENGUAJE C++
Herencia
Redefinicin de mtodos
Las clases hijas pueden redefinir mtodos heredados
Basta con definir un mtodo en la clase hija que tenga el mismo nombre,
nmero y tipo de parmetros (en C++ basta con que el nombre coincida)
La redefinicin de un mtodo en la clase hija anula el
mismo mtodo de la clase padre en la implantacin de la
clase hija
Implica prdida de comportamiento
Cmo acceder al comportamiento del padre?
En la llamada al mtodo de la clase padre se antepone el nombre de la clase padre
seguido del operador ::
INTRODUCCIN AL LENGUAJE C++
Herencia
Adicin de mtodos
Los nuevos mtodos de la clase hija procesan sus
atributos, tanto los aadidos como los heredados
En la definicin de los mtodos de la clase hija, no
se puede acceder a los atributos de la clase padre
(son privados)
Alternativa: especificador de acceso protected
INTRODUCCIN AL LENGUAJE C++
Herencia
Especificador de acceso protected
Todo lo definido bajo este especificador de acceso es
accesible desde la propia clase y sus clases hijas
Si es necesario, definir mtodos get y set protegidos en
la clase padre para que los mtodos de las clases hijas
puedan procesar los atributos heredados

INTRODUCCIN AL LENGUAJE C++
public:
// mtodos pblicos
protected:
// mtodos protegidos
private:
// atributos y mtodos privados
Ejercicio 6
Automatizacin de un estudio estadstico de la edad de
una poblacin de personas cuyo nmero no ser superior a
100. Los datos de estas edades se introducirn por
consola. El tratamiento que se debe realizar con dicha
muestra es la presentacin de la media y las modas.
El proceso de automatizacin consistir en recoger una
secuencia de edades (por ejemplo: 4, 7, 15, 7, 87 y 15 aos)
hasta que el usuario indique el trmino de la secuencia de
datos. Una vez introducidas se proceder a presentar la
media (para el ejemplo 22.5) y las modas (para el ejemplo 7
y 15 aos)

INTRODUCCIN AL LENGUAJE C++
Ejercicio 5
Clculo de la media:
Resultado de dividir la suma de los valores almacenados en la
secuencia entre el nmero de valores de la misma
Clculo de las modas:
Se obtiene el conjunto (secuencia sin valores repetidos) de las distintas
edades (4,7,15,87)
Se obtiene la secuencia de frecuencias absolutas del mismo (1,2,2,1)
Se obtiene el mximo de la secuencia de frecuencias (2)
Se obtienen las posiciones donde aparece este mximo (2,3)
Modas: conjunto de valores que ocupan las posiciones del conjunto
anterior (7,15)


INTRODUCCIN AL LENGUAJE C++
4, 7, 15, 7, 87, 15
Ejercicio 5
Para la solucin del ejercicio se debern codificar dos
clases:
Clase IntegerSequence
Clase IntegerSet
Un conjunto es una secuencia de enteros sin valores repetidos
Y un programa principal en el que se muestren 4 opciones:
1. Leer secuencia de edades
2. Calcular media
3. Calcular moda
4. Salir



INTRODUCCIN AL LENGUAJE C++
Herencia - Herencia Mltiple
Herencia mltiple: una clase hija hereda de
mas de una clase padre

INTRODUCCIN AL LENGUAJE C++
Espaola
Hispano-
Argentina
class Espaola{

};
class Argentina {

};
class Hispano-Argentina: public Espaola, public Argentina {

};
Argentina
Herencia - Herencia Mltiple
La herencia mltiple puede introducir:
Ambigedades:
Cuando se hereda de dos o mas clases un miembro
con el mismo identificador
Solucin: utilizar el operador de resolucin ::
Repeticiones:
cuando se hereda de una misma clase ms de un
vez, por distintas vas o caminos
Solucin: herencia virtual



INTRODUCCIN AL LENGUAJE C++
Herencia - Herencia Mltiple (ambigedades)
INTRODUCCIN AL LENGUAJE C++
Espaola

+ pagarImpuestos()


Argentina

+ pagarImpuestos()

Hispano-Argentina
Hispano-Argentina ha ();
ha.pagarImpuestos();
Llamada ambigua!!! Error de compilacin
Herencia - Herencia Mltiple (ambigedades)
INTRODUCCIN AL LENGUAJE C++
Espaola

+ pagarImpuestos()


Argentina

+ pagarImpuestos()

Hispano-Argentina
Hispano-Argentina ha ();
ha.Espaola::pagarImpuestos();
ha.Argentina::pagarImpuestos();
Desambiguamos con el operador de resolucin
Herencia - Herencia Mltiple (ambigedades)
INTRODUCCIN AL LENGUAJE C++
Espaola

+ pagarImpuestos()


Argentina

+ pagarImpuestos()

Hispano-Argentina

+ pagarImpuestos()

Hispano-Argentina ha ();
ha.pagarImpuestos();
O redefiniendo el propio mtodo
Herencia - Herencia Mltiple (repeticiones)
INTRODUCCIN AL LENGUAJE C++
ios

- _M_tie
- _M_fill
- _Mfill_init


+ good()
+ eof()
+ fail()


istream

ostream

iostream

_M_tie , _M_fill, _Mfill_init,
good(), eof(), fail(),
_M_tie , _M_fill, _Mfill_init,
good(), eof(), fail(),
Herencia - Herencia Mltiple (repeticiones)
INTRODUCCIN AL LENGUAJE C++
ios

- _M_tie
- _M_fill
- _Mfill_init


+ good()
+ eof()
+ fail()


istream

ostream

iostream

class istream :
virtual public ios
{

};
class ostream :
virtual public ios
{

};
_M_tie , _M_fill, _Mfill_init,
good(), eof(), fail(),
Desde el constructor de
la clase nieta llamar de
forma explicita al
constructor de la clase
abuela
Herencia - Tipos
Herencia pblica / privada / protegida



INTRODUCCIN AL LENGUAJE C++
class Hija: public Padre {

};
class Hija: private Padre {

};
class Hija: protected Padre {

};
Se conserva la visibilidad
Todo se hereda como privado
Lo pblico se hereda como protegido
Herencia - Clases abstractas
El comportamiento de una clase no debe
limitarse a aquellas operaciones que se puedan
definir
Los mtodos virtuales puros permiten posponer
su definicin a las clases hijas
Si una clase presenta un mtodo virtual puro no podr
ser instanciada
Clase abstracta: aquella clase de la que no se
pueden crear objetos


INTRODUCCIN AL LENGUAJE C++
Ejercicio 6
Crear las clases necesarias para poder trabajar con
sucesiones numricas (conjunto ordenado de nmeros)
Toda sucesin viene dada por un elemento inicial, una
regla de formacin y un nmero de elementos. Ejemplos:
2,4,6,8,10 primer elemento: 2, nmero de elementos: 5, regla de formacin: sumar
dos unidades al termino anterior
1,2,4,8 primer elemento: 1, nmero de elementos: 4, regla de formacin: multiplicar
por dos el trmino anterior
1,1,2,3,5,8,13 primer elemento:1, nmero de elementos 7, regla de formacin: el
primer y el segundo elemento han de ser 1, los siguientes se obtienen sumando los dos
anteriores
Sucesiones con las que se desea trabajar: progresiones
aritmticas y geomtricas


INTRODUCCIN AL LENGUAJE C++
Ejercicio 6
P. aritmtica: sucesin en la que cada termino se obtiene
sumando una cantidad (llamada diferencia) al trmino
anterior
Conociendo el primer trmino de la progresin y la diferencia, es
posible calcular el trmino n-simo mediante la frmula


Tambin es posible hallar la suma de los n primeros trminos con la
siguiente frmula




INTRODUCCIN AL LENGUAJE C++
d n a a
n
1
1

n
a a
S
n
n
2
1

Ejercicio 6
P. geomtrica: sucesin en la que cada termino se obtiene
multiplicando por una misma cantidad r (llamada razn) al
trmino anterior
Frmula para calcular el trmino n-simo de una progresin
geomtrica

Frmula para calcular la suma de los n primeros trminos de una
progresin geomtrica
INTRODUCCIN AL LENGUAJE C++
1
1


n
n
r a a

1
1
1

r
r a
s
n
n
Ejercicio 6
INTRODUCCIN AL LENGUAJE C++
Sucesion

- primero
- numElementos

+ getNumElementos()
+ getElemento()
+ suma()
- getPrimero()
ProgArimtica

- diferencia

+ getDiferencia()
+ suma()
+ getElemento ()
ProgGeometrica

- razon

+ getRazon()
+ suma()
+ getElemento()
Herencia - Asignaciones entre objetos
Es posible llevar a cabo asignaciones entre
objetos de una misma clase.
Y entre objetos pertenecientes a una misma
jerarqua de herencia?
Asignaciones entre objetos de una clase padre y
objetos de sus clases hijas.
Punteros a objetos de la clase padre que apuntan
a objetos de sus clases hijas



INTRODUCCIN AL LENGUAJE C++
Herencia - Asignaciones entre objetos
INTRODUCCIN AL LENGUAJE C++
Employee

- name
- salary
- department

+ increaseSalary()
+ toString()
TechnicalExpert

- courses
- maxCourses
- numCourses

+ getNumCourses()
+ assignCourse()
+ increaseSalary()
+ toString ()

Director

- employees
- maxNumEmployees
- numEmployees

+ getNumEmployees()
+ assignEmployee()
+ increaseSalary()
+ toString ()

Salesman

- clients
- maxClients
- numClients

+ getNumClients()
+ assignClient()
+ increaseSalary()
+ toString ()
Introduccin al lenguaje C++
Orgenes del lenguaje
Diferencias con respecto a C
E/S en C++
POO con C++
Herencia
Polimorfismo







PROGRAMACIN C++
Polimorfismo Definicin
Enlace dinmico de mtodos a mensajes con una
asociacin entre un mensaje y el mtodo que se
ejecuta que no se establece con el anlisis del cdigo,
sino que depende del estado de los objetos en la
ejecucin del programa
El compilador no es capaz de resolver la invocacin de
un mtodo en tiempo de compilacin
Relacin entre herencia y polimorfismo
Puede haber herencia sin polimorfismo?
Y polimorfismo sin herencia?

INTRODUCCIN AL LENGUAJE C++
Polimorfismo en C++
Requisitos:
Mtodo/s virtuales
Herencia
Instanciacin dinmica (punteros)
El polimorfismo slo puede llevarse a cabo a travs de
punteros o referencias a la clase base de la jerarqua.
La invocacin a un mtodo virtual (o virtual puro)
a travs de un puntero a clase base puede
traducirse en distintos comportamientos.
INTRODUCCIN AL LENGUAJE C++
Polimorfismo en C++
Destructores virtuales:
Qu ocurre cuando destruyo una referencia a una
clase base que apunta a un objeto de una clase
derivada?
Se llamar al destructor de la clase base
No se liberarn los recursos reservadas por el objeto
de la clase derivada
Solucin: definir el destructor de la clase base como
virtual

INTRODUCCIN AL LENGUAJE C++
Polimorfismo en C++
Cundo definir mtodos virtuales?
Siempre que quiera tener polimorfismo
Qu mtodos han de ser virtuales?
Destructor de la clase mas alta en la jerarqua de
herencia
Mtodos de una clase que puedan ser redefinidos
en sus clases derivadas con el mismo nmero y
tipo de parmetros

INTRODUCCIN AL LENGUAJE C++
Polimorfismo en C++
Operador typeid
Permite comprobar en tiempo de ejecucin la clase a la
que pertenece un objeto que es apuntado por un puntero a
clase base
La llamada al operador devuelve una referencia constante
a un objeto de la clase type_info


Clase type_info
Definida en el fichero de cabecera <typeinfo>
Mtodos: name(), operator==, operator!=,


INTRODUCCIN AL LENGUAJE C++
Sucesion * s=new ProgAritmetica(1,5,1);
cout<<typeid(s).name();
Polimorfismo en C++
Operador dynamic_cast
Permite la conversin de
Punteros a clase base a punteros a clases hijas
Punteros de clases hijas a punteros a clase base




El uso combinado de los operadores dynamic_cast y typeid
aumenta el acoplamiento ente mdulos y rompe la abstraccin
que proporciona el polimorfismo
INTRODUCCIN AL LENGUAJE C++
Sucesion * s=new ProgAritmetica(1,5,1);
ProgAritmetica * pA = dynamic_cast<ProgAritmetica*>s;
dynamic_cast<PunteroANuevaClase> punteroAClase;
Polimorfismo en C++
Abstraccin
El polimorfismo me permite que una clase puede trabajar con
distintas clases de objetos de una misma jerarqua, sin que esta
tenga que conocerlas a todas
Reduce el acoplamiento entre mdulos (clases)
Ejemplo: aadir un tipo de empleado mas no implica ninguna
modificacin en mi clase Director
El uso de operadores como type_id y dynamic_cast
producen el efecto contrario (evitar)
Extensibilidad
Poder aadir nuevas clases a una jerarqua sin tener que hacer
modificaciones en las clases que ya hacan uso de ella
INTRODUCCIN AL LENGUAJE C++
Ejercicio 7
Una pequea localidad tiene un parque de
bomberos que realiza muchas salidas a lo
largo del mes. El parque de bomberos ha
decidido adoptar un sistema informtico que
gestione de manera ms eficiente las salidas
de los vehculos para las diferentes
emergencias que vayan surgiendo
Enunciado
INTRODUCCIN AL LENGUAJE C++

Anda mungkin juga menyukai