La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( Técnicas Experimentales."— Transcripción de la presentación:

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 en Física de Partículas Curso 2010 - 2011 3

2 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íaLenguaje EstructuradaFortran, C, Pascal, Basic Orientada a objetos (OOP)C++, Java, Smalltalk Orientada a eventosVisualBasic

3 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

4 4 Clase y Objeto Un objeto es algo de lo que hablamos y que podemos 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:Clase Atributo1=valor Atributo2=valor...

5 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 a varias clases Una de las clases comparte la estructura y/o el comportamiento de otra(s) clase(s).

6 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.

7 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

8 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)

9 9 Compilar g++ -o main.cc Escribir, compilar, linkar, ejecutar Código (.cc,.C,.cpp…) #include 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

10 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 int main() { cout << “Hola mundo” << endl; return 0; } Fichero objeto (.obj,.o) main.o libMyLib.so other.o Ficheros intermedios (.i,.ii) Preproceso

11 11 Tipos fundamentales Nombre¿Qué representa?Entero, real, lógico char Un carácterEntero short int Un entero cortoEntero int Un enteroEntero long int Un entero con mayor rango de validez Entero float Un realReal double Un real de doble precisiónReal long double Un real de doble precisión y mayor Real bool cierto ( true ) o falso ( false ) Lógico unsigned

12 12 Operadores aritméticos OperadorFunciónUso = 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 = 0 int k = --i; //k = 0 +=,-=, *=,/= opera y asigna r += 2.6; //r = r + 2.6 r *= 2.6; //r = r * 2.6

13 13 Operadores lógicos OperadorFunciónUso < 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 4 || O lógico i 4

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

15 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; else sentencia2;

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

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

18 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)

19 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 = 1 do { cout << "3 * " << i << " = " << 3 * i << endl; i++; } while (i <= 10)

20 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

21 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

22 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

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

24 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 >) – 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 + objB se transforma en: objA.operator+(objB) o se transforma en: operator+(objA, objB)

25 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

26 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(…) {... }

27 27 Ejemplo: Herencia Figura Posicion: Vector2D grosor: int Estilo: int… Traslada() Rota() area() = 0 Cuadrado lado: double area() Diagonal() Circulo radio: double area() diametro()

28 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)

29 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 nombre template float f(tipo a, int b,…); template 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 template template Tipo Min(Tipo n1, Tipo n2) { return (n1 < n2) ? n1 : n2; } //Uso int iminimo = Min (10,20); //ó Min(10,20) iminimo == 10 double rminimo = Min(3.14, 1.22); //rminimo == 1.22

30 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 MiClase { public: MiClase(…); ~MiClase(); Tipo foo(…); protected: Tipo* atributo; }; template MiClase ::MiClase(…) {…}

31 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 Array { public: Array(int size); virtual ~Array() {delete[] elArray;} Tipo2& operator[](int i); protected: Tipo2* elArray; }; template Array ::Array(int size) { elArray = new Tipo2[size]; } template Array ::~Array(int size) { delete[] elArray; } template Tipo2& Array :: operator[](int i) { return elArray[i]; } Declaración Implementación //Array de enteros de //dimensión 4 Array ia(4); //Array de complejos de //dim size Array ClA(size);

32 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

33 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)

34 34 Punteros (ejemplos) int *intptr; //Declaracion de un puntero int* intptr2; //Idem double pi = 3.1415; double *piptr = π //piptr apunta a pi //Las dos lineas siguientes imprimen lo mismo cout << “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 tambien piptr = &otro; //piptr ahora apunta a otro cout << “El valor de pi es “ << *piptr << endl; //6.28 int miarray[] = {1, 2, 3}; //Inicialización int uno = *miarray; //uno == 1

35 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

36 36 Gestión dinámica de memoria (ejemplo) Miclase* miclasePtr = 0; //Con inicialización miclasePtr = new Miclase(…) //Creamos un nuevo objeto Miclase miclasePtr->AlgunMetodo(…); //Acceso a AlgunMetodo() delete miclasePtr; //Liberamos la memoria de miclasePtr int nelems; … double nums[nelems]; //ERROR: dim desconocida al compilar double* nums = new double[nelems]; //Reservamos memoria for (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


Descargar ppt "Introducción a la programación Orientada a Objetos y el C++ Isidro González Caballero ( Técnicas Experimentales."

Presentaciones similares


Anuncios Google