Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero (...

36
Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( [email protected] ) Técnicas Experimentales en Física de Partículas Curso 2010 - 2011 3

Transcript of Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero (...

Page 1: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

Introducción a la programación Orientada a Objetos y el C++

Isidro González Caballero( [email protected] )

Técnicas Experimentales en Física de Partículas

Curso 2010 - 20113

Page 2: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

2

Introducción

Los problemas suelen tener varias soluciones posibles.

En programación existen diversas metodologías que nos ayudan a enfrentar un problema.

Cada metodología tiene diversos lenguajes que las soportan.– Algunos lenguajes soportan varias metodologías.

Metodología Lenguaje

Estructurada Fortran, C, Pascal, Basic

Orientada a objetos (OOP) C++, Java, Smalltalk

Orientada a eventos VisualBasic

Page 3: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

3

Programación Orientada a Objetos

Definición:

La Programación Orientada a Objetos (OOP) es un método de programación en el cual los programas se organizan en colecciones cooperativas de objetos, cada uno de los cuales representa una instancia de alguna clase, y cuyas clases son, todas ellas, miembros de una jerarquía de clases unidas mediante relaciones de herencia.

Comentarios: Usamos objetos en lugar de algoritmos como bloque

fundamental Cada objeto es una instancia de una clase Las clases están relacionadas entre sí por relaciones tan

complejas como la herencia

Page 4: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

4

Clase y Objeto

Un objeto es algo delo que hablamos y

quepodemos manipular Existen en el mundo

real (o en nuestro entendimiento del mismo)

Una clase describe los

objetos del mismo tipo

Todos los objetos son instancias de una clase

Describe las propiedades y el comportamiento de un tipo de objetos

Clase

Atributos

Operaciones

Objeto:ClaseAtributo1=valorAtributo2=valor...

Page 5: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

5

Herencia

¡Relación característica de la OOP! Puede expresar tanto especialización

como generalización Evita definir repetidas veces

las características comunes avarias clases

Una de las clases comparte la estructura y/o el comportamiento de otra(s) clase(s).

Page 6: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

6

Relación de Herencia: Vocabulario

Clase base o superclase: clase de la cual se hereda Clase derivada o subclase: clase que hereda Herencia simple: Hereda de una sola clase Herencia múltiple: Hereda de varias clases

– Java solo la soporta parcialmente– Presenta diversos problemas (¿qué hacer cuando se

hereda más de una vez de la misma clase?)

Clase abstracta: La que no lleva, ni puede llevar, ningún objeto asociado

Polimorfismo: Posibilidad de usar indistintamente todos los objetos de un clase y derivadas.

Page 7: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

7

Relación de Herencia: Ejemplo

Figura plana

Triángulo

Rectángulo

Equilátero

Escaleno

Isósceles

Cuadrado

Polimorfismo

Clase abstracta

Superclase Subclase

Herencia simple

Page 8: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

8

C++

El C++ es un superconjunto del C– Soporta tanto metodologías de programación

estructurada como OOP– Tiene la capacidad de usar librerías C y FORTRAN

Características ajenas a la OOP y al C:– Chequeo de tipos mejorado (más estricto)– Constantes simbólicas (const) (chequeo de tipos

constantes)– Sustitución de funciones inline (eficiencia de ejecución)– Argumentos por defecto (ahorro de código)– Sobrecarga de funciones y operadores (los tipos

derivados tienen sintaxis iguales a los nativos)– Manejo de memoria dinámica– El tipo referencia (alias)

Page 9: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

9

Compilar

g++ -o main.cc

Escribir, compilar, linkar, ejecutar

Código(.cc, .C, .cpp…)

#include <iostream>

int main() {

cout << “Hola mundo”

<< endl;

return 0;

}

Diseñar

Escribir

Fichero objeto(.obj, .o)

Ejecutable(a.out, .exe, …)Ejecutar

./a.out

Hello world Linkar

g++ main.o

main.o

libMyLib.so

other.o

a.out

Page 10: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

10

Compilación

Preprocesador

No son comandos C++…– … pero están presentes en

cualquier compilador Muy utilizadas en C…

– … suprimidas algunas en C++

Se escriben con el símbolo # al comienzo

Es una especie de parser

Algunas posibilidades

Incluir código de otros ficheros

Remplazar variables o símbolos– en gral. no necesario en C++

Trucos sucios– no recomendable

Incluye cierta lógica

Compilar

g++ -o main.cc

Código(.cc, .C, .cpp…)

#include <iostream>

int main() {

cout << “Hola mundo”

<< endl;

return 0;

}

Fichero objeto(.obj, .o)

main.o

libMyLib.so

other.o

Ficheros intermedios

(.i, .ii)Preproceso

Page 11: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

11

Tipos fundamentales

Nombre ¿Qué representa? Entero, real, lógico

char Un carácter Entero

short int Un entero corto Entero

int Un entero Entero

long int Un entero con mayor rango de validez

Entero

float Un real Real

double Un real de doble precisión Real

long double Un real de doble precisión y mayor

Real

bool cierto (true) o falso (false) Lógico

unsigne

d

Page 12: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

12

Operadores aritméticos

Operador Función Uso

= asignación int i = 7;

* multiplicación double r = 3.5 * i;

/ división double t = r / 1.2;

% modulo (resto) i = 21 % 6; // i = 3

+ suma double rt = r + t;

- resta r = rt – t;

++,-- incremento int i = 0;int j = i++; //j = 0int k = --i; //k = 0

+=,-=,*=,/=

opera y asigna r += 2.6; //r = r + 2.6r *= 2.6; //r = r * 2.6

Page 13: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

13

Operadores lógicos

Operador Función Uso

< menor que i < 5

<= menor o igual que

r <= 5

> mayor que i > 5

>= mayor o igual que

i >= 5

== igualdad i == 5

!= desigualdad i != 5

! NOT lógico !true; //false

&& Y lógico i < 5 && j > 4

|| O lógico i < 5 || j > 4

Page 14: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

14

Operador aritmético if

Es el único operador ternario (tiene 3 “argumentos”)

Es el equivalente a un if-else Sintaxis:expresion1 ? expresion2 : expresion3

Se evalúa expresión1– Si es cierto se evalúa expresion2– En caso contrario se evalúa expresion3

int sign(double val) {//Posible función sign() int s = (val < 0)? -1: 1; return s;}

Page 15: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

15

Control de flujo: if-then-else

Ejecución condicional Sintaxis simple:

– Si la expresión lógica es cierta se ejecuta sentencia1 Sintaxis completa:

– Si la expresión lógica es falsa se ejecuta la sentencia2 Si hay más de una sentencia a ejecutar por caso se

meten entre { }

if (expresión lógica) sentencia1;

if (expresión lógica) sentencia1;else sentencia2;

Page 16: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

16

if-then-else ejemplo

int mifuncion(); //Una funcion que devuelve un numero entero........int i = mifuncion();

cout << "El valor devuelto por mifuncion es ";if (i < 0) cout << "negativo" << endl;else if (i > 0) cout << "positivo" << endl;else cout << "nulo" << endl;

Page 17: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

17

Control de flujo: for

Iteraciones Sintaxis:

– La inicialización (de un contador) solo se ejecuta la primera vez que entra en el bloque

– La parada es una expresión lógica Mientras sea cierta se sigue iterando Cuando sea falsa se sale del bucle

– La acción (normalmente el incremento de un contador) se ejecuta al final de cada iteración

for (inicialización; parada; acción) sentencia;

Page 18: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

18

Control de flujo: while y do-while

Sintaxis:

– Sólo si expresión es cierta se ejecuta una nueva iteración– La comprobación se hace al inicio

Sintaxis

– Sólo si expresion es cierta se ejecuta una nueva iteración– La comprobación se hace al final: La sentencia se ejecuta

al menos una vez!

while (expresion) sentencia;

do sentencia;while (expresion)

Page 19: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

19

Ejemplo Iteración: Tabla del 3

cout << "Tabla de multiplicar del 3..." << endl;for (int i = 1; i <= 10; i++) { cout << "3 * " << i << " = " << 3 * i << endl;}

int i = 1;while (i <= 10) { cout << "3 * " << i << " = " << 3 * i << endl; i++;}

int i = 1do { cout << "3 * " << i << " = " << 3 * i << endl; i++;} while (i <= 10)

Page 20: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

20

Clases

class MiClase {

public: MiClase(...); //Constructor ~MiClase(); //Destructor

//Metodos int metodo1(...); //ejemplo

protected: //Data members int dato1; //ejemplo float dato2; //ejemplo

};

MiClase es el nombre de la clase

Visibilidad:• public: Visible para

cualquier otra clase• protected: Visible solo para

subclases• private: Visible solo para la

propia clase

Datos: Definen el estado de los objetos de esta clase

Page 21: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

21

Clases

class MiClase {

public: MiClase(...); //Constructor ~MiClase(); //Destructor

//Metodos int metodo1(...); //ejemplo

protected: //Data members int dato1; //ejemplo float dato2; //ejemplo

};

Constructor:• Puede haber varios• Puede tomar argumentos• Es la función que se

ejecuta cuando se crea un objeto

Destructor:• Solo puede haber uno• No toma argumentos• Es lo último que se ejecuta

cuando se destruye un objeto

Métodos: Definen el comportamiento de una clase

Page 22: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

22

Objetos de una clase

Los objetos de una clase se declaran:– Como cualquier variable si hay constructor que

no toma argumentos– Pasándole los parámetros del constructor a la

variable como si fuera una función

Los métodos se acceden usando el operador punto (.) (o flecha, ->, para punteros)

class MiClase {public: MiClase(int a=0); bool foo() {return true;}};

MiClase miobj; //== miobj(0)MiClase miobj3(3);

miobj.foo(); //true

Page 23: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

23

Ejemplo: Clase complejo

class Complex {public: Complex(double re=0, double im=0); //Constructor ~Complex(); //Destructor

//Metodos double getReal() const; //Averiguar la parte real double getImaginaria() const; //La parte imaginaria double Modulo() const; //Averiguar el modulo double Phi() const; //Averiguar el argumento

protected: //Data members double Real; //parte real double imaginario; //parte imaginaria};

Page 24: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

24

Sobrecarga de operadores

Permite redefinir cómo actúan los operadores sobre los objetos de nuestras clases

Se suelen definir dentro de la propia clase– Salvo casos específicos (operadores << y >>)– Hay que tener cuidado con cuestiones como la

conmutatividad Son funciones o métodos como cualquier otro con

nombres un poco especiales La expresión:

objA + objBse transforma en:

objA.operator+(objB)o se transforma en:

operator+(objA, objB)

Page 25: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

25

Singletons

Clases para las cuales existe un sólo objeto asociado (una sola instancia)

Situación natural en muchos casos:– Objetos que controlan “procesos” (ej. Decayer)

No está soportado por el lenguaje pero se puede conseguir…– No admite argumentos en su construcción

Usar set methods

– El constructor debe tener acceso protected/private

– Uso de static para: Controlar el número de instancias Acceder a la única instancia

Page 26: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

26

Herencia

Se indica al declarar la clase– Puede ser public/private/protected

… casi siempre es public (~99.999999999% de las veces)

Los métodos que pueden ser especializados en las subclases se anteceden por la palabra virtual– Si no tienen implementación posible en la superclase se

les añade “= 0“ … y no se implementa ningún código para ellos Métodos

puramente virtuales

class Hija: public Madre { public: Hija(…); virtual ~Hija() {}};

Hija::Hija(...): Padre(…) { ...}

Page 27: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

27

Ejemplo: Herencia

FiguraPosicion: Vector2Dgrosor: intEstilo: int…Traslada()Rota()area() = 0

Cuadradolado: doublearea()Diagonal()

Circuloradio: doublearea()diametro()

Page 28: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

28

Templates (plantillas)

El comportamiento no depende del tipo de alguno de sus:– Atributos (clases)– Argumentos (funciones y métodos)

Se utilizan para:– Algoritmos (ej. ordenación)– Colecciones (ej. listas, conjuntos, arrays)– Trucos diversos (meta-programming)

Existe una librería altamente optimizada que proporciona toda esta funcionalidad: la STL (Standard Template Library)

Page 29: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

29

Function templates

Funciones cuyo comportamiento no depende del tipo de alguno de sus argumentos– Pueden ser funciones generales– O alguno de los métodos de una clase

Sintáxis: tipo es cualquier nombretemplate <class tipo> float f(tipo a, int b,…);template <typename tipo> float f(tipo a, int b, …);

Muy útiles para algoritmos de ordenación:– Min/Max, Qsort,…– El “tipo” solo tiene que tener el operador < definido

//Funcion templatetemplate <class Tipo> Tipo Min(Tipo n1, Tipo n2) { return (n1 < n2) ? n1 : n2;}//Usoint iminimo = Min<int>(10,20); //ó Min(10,20) iminimo == 10double rminimo = Min(3.14, 1.22); //rminimo == 1.22

Page 30: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

30

Class templates

Cuando el comportamiento de la clase no depende del tipo de uno o más de sus atributos (data members)– Colecciones: Vectores, listas, mapas…– Objetos matemáticos: Matrices, Vectores, …

Sintáxis:template <class Tipo> class MiClase {public: MiClase(…); ~MiClase(); Tipo foo(…);protected: Tipo* atributo;};

template <class Tipo> MiClase<Tipo>::MiClase(…) {…}

Page 31: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

31

Templates: Ejemplo

Todo en el mismo fichero (header, .hh)

Cada vez que se utilice se genera todo el código para el tipo correspondiente

template <class Tipo2> class Array {public: Array(int size); virtual ~Array() {delete[] elArray;} Tipo2& operator[](int i);protected: Tipo2* elArray;};

template <class Tipo2> Array<Tipo2>::Array(int size) { elArray = new Tipo2[size];}template <class Tipo2> Array<Tipo2>::~Array(int size) { delete[] elArray;}template <class Tipo2> Tipo2& Array<Tipo2>:: operator[](int i) { return elArray[i];}

Declaració

nIm

plem

entació

n

//Array de enteros de//dimensión 4Array<int> ia(4); //Array de complejos de//dim sizeArray<Complex> ClA(size);

Page 32: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

32

Punteros (¿qué son?)

Almacenan direcciones de memoria Se utilizan en general para

– Gestionar dinámicamente (en tiempo de ejecución en lugar de en tiempo de compilación) memoria

Arrays de dimensión variable

– Pasar argumentos por referencia a los métodos (aunque no es necesario)

– Inclusión de objetos por referencia. Una misma copia de un objeto puede estar en varios

objetos Si se modifica en uno de ellos se modifica en todos.

– Cadenas de caracteres Los arrays son equivalentes a punteros

Page 33: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

33

Punteros (utilización)

Se declaran con un asterisco (‘*’) después del tipo Cuando no apuntan a ningún sitio su valor es 0

– Ojo: No es su valor por defecto. ¡Se debe inicializarlos! Se accede al objeto al que apuntan poniendo un ‘*’

delante del nombre del puntero Se accede a la posición de memoria de un objeto

poniendo ‘&’ delante de su nombre El acceso a los métodos del objeto apuntado por

un puntero se hace con el operador ‘->’ Cadenas de caracteres:

– Son de tipo char*– Se inicializan con una cadena entre comillas– Su dimensión es el número de caracteres + 1 (\0,

terminación de cadena)

Page 34: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

34

Punteros (ejemplos)

int *intptr; //Declaracion de un punteroint* intptr2; //Idem

double pi = 3.1415;double *piptr = &pi; //piptr apunta a pi//Las dos lineas siguientes imprimen lo mismocout << “El valor de pi es “ << pi << endl;cout << “El valor de pi es “ << *piptr << endl;

double otro = *piptr; //otro toma el valor de pi (no dir)otro = 6.28; //pi sigue valiendo lo mismo y piptr tambienpiptr = &otro; //piptr ahora apunta a otrocout << “El valor de pi es “ << *piptr << endl; //6.28

int miarray[] = {1, 2, 3}; //Inicializaciónint uno = *miarray; //uno == 1

Page 35: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

35

Gestión dinámica de memoria

Utilizamos los operadores new (para crear nuevo espacio) y delete (para liberar el espacio creado)– En general por cada new que pongamos

tendremos un delete en algún sitio Soportan la posibilidad de crear arrays

– Tipo* variable = new Tipo[dimension];– A partir de este momento se puede usar la

sintaxis de arrays– delete[] variable; Muy importantes los

corchetes Si no se usan solo se libera el espacio del primer

elemento

Page 36: Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( gonzalezisidro@uniovi.es )gonzalezisidro@uniovi.es Técnicas Experimentales.

36

Gestión dinámica de memoria (ejemplo)

Miclase* miclasePtr = 0; //Con inicializaciónmiclasePtr = new Miclase(…) //Creamos un nuevo objeto MiclasemiclasePtr->AlgunMetodo(…); //Acceso a AlgunMetodo()delete miclasePtr; //Liberamos la memoria de miclasePtr

int nelems;…double nums[nelems]; //ERROR: dim desconocida al compilardouble* nums = new double[nelems]; //Reservamos memoriafor (unsigned int i = 0; i < nelems; i++) nums[i] = i*10;//Esto imprime ‘El cuarto elemento vale: 30’cout << “El cuarto elemento vale: “ << nums[3] << endl;

delete[] nums; //Liberando la memoria