1 / 38

Informática II

Informática II. Clase 4: Referencias. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Zona de Preguntas. Cómo se declara un puntero? Para que son útiles los punteros? Que es el heap o free store ? Cómo se reserva memoria en el heap ?

wilona
Download Presentation

Informática II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informática II Clase 4: Referencias Diego Fernando Serna Restrepo Semestre 2011/2

  2. Chiste del Día Informática II 2011/2

  3. Zona de Preguntas • Cómo se declara un puntero? • Para que son útiles los punteros? • Que es el heap o free store? • Cómo se reserva memoria en el heap? • Mencione 2 caracteristicas del heap • Que pasa en el código mostrado? #include<iostream> double*ptr; //el puntero se declara como global intmain() { for(;;){ //bucle infinito ptr=newdouble; //se pide espacio en la memoria dinámica } return 0; } Informática II 2009/2

  4. Contenido Repaso 1 Referencias 2 Funciones por referencias 3 Referencias Vs punteros 4 Informática II 2011/2

  5. Características de un apuntador • Un puntero es una variable como cualquier otra. Excepto que solo puede almacenar direcciones de otras variables común y corrientes. • Un puntero apunta a una variable en memoria. • Son útiles para pasar y regresar valores a la rutina que las llama. • Si son usadas incorrectamente se pueden convertir en fuente de fallas y frustraciones. El tipo de variable que almacena una dirección se denomina puntero. Informática II 2011/2

  6. Espacios de memoria • Reservada antes de la ejecución del programa • Permanece fija. • No requiere gestión durante la ejecución. • El sistema operativo se encarga de la reserva, recuperación y reutilización. • Se accede a un espacio en esta cada vez que se declaran Variables globales o tipo static. • Es una zona de memoria que gestiona las llamadas a funciones durante la ejecución de un programa. • Cada vez que se realiza una llamada a una función en el programa, se crea un entorno de programa que se libera cuando acaba su ejecución. • La reserva y liberación de la memoria la realiza el S.O. de forma automática durante la ejecución del programa. • Es una zona de memoria donde se reservan y se liberan “trozos” durante la ejecución de los programas según sus propias necesidades, este proceso es usualmente llamado gestiónde memoria dinámica. • Optimiza el almacenamiento de datos. Informática II 2009/2

  7. “Free store” – “Heap” • Para reservar memoria en el Heap es necesario usar el comando new, el cual devuelve la dirección donde se reservó la variable. typedef unsigned short int USHORT; USHORT * pPuntero; pPuntero = new USHORT; /*también es posible hacerlo todo en una sola línea. USHORT * pPuntero = new USHORT; */ Informática II 2011/2

  8. Liberando la memoria del heap • Para liberar la memoria del HEAP se usa el comando delete sobre el puntero. deletepPuntero; • Es MUY importante liberar la memoria del Heap, pues en caso de perder el rastro de los punteros podrán presentarse “fugas de memoria” Informática II 2011/2

  9. Operador delete • El operador deleteno elimina el puntero, simplemente lo desreferencia. • Cuando se utiliza el operardodelete más de una vez, puede generar que el programa se estrelle, por ello es recomendable inicializar el puntero a NULL, haciendo esto se garantiza mayor seguridad, y de este modo se puede volver a reutilizar el puntero. int*ptr =newint; //reservamemoria deleteptr; //desrefernciaptr ptr=NULL; //lo lleva a NULL deleteptr; //no hay problema //se puede volver a referenciar a otro espacio de memoria ptr=newint; Informática II 2011/2

  10. Accediendo a los miembrosde una clase • //Las siguientes lineas hacen lo mismo (* pCat).numeroPatas(); pCat->numeroPatas(); Informática II 2011/2

  11. El Puntero “this” • Todas las clases tienen un puntero escondido denominado “this”, el cual apunta sobre la dirección del objeto en cuestión. • No hay necesidad de preocuparse de la creación ni el borrado de este puntero, pues el compilador se encarga de esto. Informática II 2011/2

  12. Puntero this Informática II 2011/2

  13. Puntero this Qué pasa si un método de una clase necesita como argumento un objeto de la misma clase? myCicla2 c1; myCicla2 c2; int main(){ if(c1.estaEsmiCicla(c2)==true){ cout<<"estasies mi cicla!!!"<<endl; } else{ cout<<"esta no es mi cicla!!!"<<endl; } return 0; } bool myCicla2::estaEsmiCicla(myCicla2 &cicla){ if(this==&cicla){return true; } else{ return false; } } Informática II 2011/2

  14. Fugas de memoria • Cuando “se pierde de vista” la dirección o el puntero que lleva registro del espacio en el Heap, se dice que hubo una fuga de memoria. • La memoria desperdiciada por causa de fugas de memoria, NO podrá liberarse sino hasta que termine el programa. Informática II 2009/2

  15. Fugas de memoria • Es muy frecuente que ocurra cuando el puntero es declarado como variable local (dentro de una función) y luego se sale de ésta sin antes liberar la memoria. • Es muy común usar los constructores para reservar memoria en el heap y los destructores para liberarla. • ¡OJO!, realizar un delete sobre un puntero libera la memoria, realizarlo de nuevo estrellará el programa. Para que esto no ocurra, asígnele al puntero el valor de cero DESPUÉS de hacer el primer delete. Informática II 2009/2

  16. Resumen de apuntadores Informática II 2009/2

  17. Contenido Repaso 1 Referencias 2 Funciones por referencias 3 Referencias Vs punteros 4 Informática II 2011/2

  18. Referencias • Las referencias son “alias” de otros objetos, por lo tanto cuando se manipula una referencia, realmente se está manipulando el objeto al que ésta hace referencia. Informática II 2011/2

  19. Declaración de Referencias int Edad = 5; int &rVbleReferencia = Edad; // int &rOtraVble = int // error!, esta mal referenciado Informática II 2009/2

  20. Referencias 0X0FDE00 0X0FDE04 socio1, socio2 0X0FDE08 int socio1; int &socio2=socio1; • Las referencias difieren con otro tipo de variables ya que deben declararse inicializándolas con las variables a las que harán referencia. Si se tratan de declarar sin inicializar, el programa no compilará. • Si se toma la dirección de una referencia (&rReferencia), el valor que devuelve es la dirección de la variable a la que apunta la referencia. Informática II 2011/2

  21. Referencias • Las referencias SÓLO pueden ser asignadas una vez, por lo tanto, todas las operaciones que se hagan a la referencia, en realidad se estarán haciendo sobre el objeto al que hacen referencia. • ¡NO TRATE DE REASIGNAR UNA REFERENCIA! Informática II 2011/2

  22. Referencias • Las referencias pueden trabajar con todo tipo, incluso con objetos. • Cuando una referencia hace referencia a un objeto, puede usar todos sus miembros y métodos tal y como se hace con objeto real. Informática II 2011/2

  23. Contenido Repaso 1 Referencias 2 Funciones por referencias 3 Referencias Vs punteros 4 Informática II 2011/2

  24. Pasar y retornar valores por referencia • A las funciones normalmente se le pasan los argumentos por valor y sólo devuelven un valor. • Si se pasan los parámetros por referencia, se puede superar éstas limitantes. Existe dos formas de hacerlo; usando punteros o referencias • Se dice que uno pasa “por referencia” cuando usa punteros o uno pasa “una referencia” cuando usa referencias. Informática II 2011/2

  25. Pasar y retornar valores por referencia • Cuando se pasa por referencias, realmente se pasa la dirección del objeto real (en vez del objeto entero), para luego manipular directamente el objeto, no su copia. Informática II 2011/2

  26. Retornos múltiples valores en las funciones • Existen 2 formas de hacerlo; pasar los objetos por referencia y trabajarlos dentro de la función o haciendo lo mismo pero con los punteros. • Estos métodos permiten que se use el valor de retorno de la función para reportar errores. Informática II 2011/2

  27. Pasar por referencia para ser más eficiente • Cada vez que se pasa un objeto por valor, se genera una copia de éste en la pila, lo cual hace que se requiera tiempo y memoria. • Cuando se trabajan con valores sencillos(int, short, etc..), es un costo tribial; sin embargo, con objetos complicados es un costo significativos. Informática II 2011/2

  28. Ejemplo funciones por referencia //Paso de argumentos por referencia //mediante punteros // int *ptr_a=&num1 , int *ptr_b=&num2 void permutar2(int *ptr_a,int *ptr_b){ inttemp=*ptr_a; *ptr_a=*ptr_b; *ptr_b=temp; } //Paso de argumentos mediante //referencias //int &a=num1 , int &b=num2 void permutar3(int &a,int &b){ inttemp=a; a=b; b=temp; } //Paso de argumentos por valor //int a=num1 , int b=num2 void permutar1(int a, int b){ inttemp=a; a=b; b=temp; } usingnamespacestd; void permutar1(int a, int b); void permutar2(int *ptr_a,int *ptr_b); void permutar3(int &a,int &b); intmain(){ int num1=8; int num2=9; cout<<"Antes de utilizar la funcion1: "<<endl; cout<<"valor Variable1: "<<num1<<endl; cout<<"valor Variable2: "<<num2<<endl; permutar1(num1,num2); cout<<"luego de utilizar la funcion1: "<<endl; cout<<"valor Variable1: "<<num1<<endl; cout<<"valor Variable2: "<<num2<<endl; permutar2(&num1,&num2); cout<<"luego de utilizar la funcion2: "<<endl; cout<<"valor Variable1: "<<num1<<endl; cout<<"valor Variable2: "<<num2<<endl; permutar3(num1,num2); cout<<"luego de utilizar la funcion3: "<<endl; cout<<"valor Variable1: "<<num1<<endl; cout<<"valor Variable2: "<<num2<<endl; return 0; } Informática II 2011/2

  29. Pasar por referencia para ser más eficiente • Los “constructores de copia” también son llamados cuando se pasa un objeto por copia, generando grandes gastos de memoria y procesamiento. • Cuando los objetos temporales de las funciones son destruidos (cuando se sale de la función), el destructor del objeto es llamado. Informática II 2011/2

  30. Pasar por referencia para ser más eficiente • Si una función devuelve un objeto por valor, el constructor de copia y destructor de dicho objeto es ejecutado. • Pasar valores por referencia, ahorra tiempo de procesamiento y memoria, pues no se hace llamado a las funciones de copia y las variables no son copiadas en el stack. Informática II 2011/2

  31. Pasando punteros const Informática II 2011/2

  32. myCicla3::myCicla3(){ • color=0; • } • myCicla3::~myCicla3(){} • int myCicla3::getColor() const{ • return color; • } • void myCicla3::setColor(int _color){ • color=_color; • } Ejemplo punteros constantes class myCicla3{ private: int color; public: myCicla3(); voidsetColor(int _color); intgetColor() const; ~myCicla3(); }; • const myCicla3 mybike; • const myCicla3 *ptr_mybike=&mybike; • int color; • int main(){ • ptr_mybike->setColor(4); //error compilador • color=ptr_mybike->getColor(); • cout<<"el color es:"<<color<<endl; • } Informática II 2009/2

  33. Contenido Repaso 1 Referencias 2 Funciones por referencias 3 Referencias Vs punteros 4 Informática II 2011/2

  34. Cuando usar referencias o punteros Informática II 2011/2

  35. Ejercicio • Utilizando la programación orientada a objetos, implemente una clase llamada numero con su respectivo constructor y destructor, que contenga una variable miembro privada llamada num1 tipo int, • Los métodos a implementar son los siguientes: • setNum: será el encargado de almacenar el dato ingresado por consola por el usuario. • getNum: permite tener acceso al valor de la variable num1 que es privada. • mayor: sus argumentos de entrada deben ser dos objetos de la misma clase creada (numero), pasados por referencia. El método debe identificar cual de las dos variables miembro num1 respectivas a cada objeto es más grande, y llevar ambas ha dicho valor. Al final debe retornar un cero, ó si ambas variables son iguales se debe retornar un uno. • En el main se debe tratar el valor retornado por el método mayor, imprimiendo un mensaje informativo según su conveniencia para cada caso. Informática II 2011/2

  36. GRACIAS POR SU ATENCIÓN Informática II 2009/2

  37. Bibliografía • man, ¡no dude en utilizarlo!! • Como Programar en C++ - Deithel & Deithel Ed. PRENTICE HALL • Sams Teach Yourself C++ in One Hour a Day, J. Liberty,S. Rao, B. Jones http://newdata.box.sk/bx/c/ Informática II 2011/2

  38. Gracias ! Informática II 2009/2

More Related