La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.

Presentaciones similares


Presentación del tema: "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."— Transcripción de la presentación:

1 Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2

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

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

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

5 El tipo de variable que almacena una dirección se denomina puntero. 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. Características de un apuntador Informática II 2011/2

6 Espacios de memoria Informática II 2009/2 6 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. 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 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ón de memoria dinámica. Optimiza el almacenamiento de datos. 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ón de memoria dinámica. Optimiza el almacenamiento de datos.

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 7

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

9 Operador delete El operador delete no elimina el puntero, simplemente lo desreferencia. Cuando se utiliza el operardo delete 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. El operador delete no elimina el puntero, simplemente lo desreferencia. Cuando se utiliza el operardo delete 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. Informática II 2011/2 9 int *ptr =new int;//reserva memoria delete ptr;//desreferncia ptr ptr=NULL;//lo lleva a NULL delete ptr;//no hay problema //se puede volver a referenciar a otro espacio de memoria ptr=new int;

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

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 11

12 Puntero this class myCicla{ private: int color; public: myCicla(); void setColor(int _color); int getColor(); ~myCicla(); }; void myCicla::setColor(int _color){ this->color=_color; } void myCicla::setColor(int _color){ color=_color; } Informática II 2011/2 12

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

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 14

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 15

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

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

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 18

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

20 Referencias 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 20 socio1, socio2 0X0FDE04 0X0FDE00 0X0FDE08 int socio1; int &socio2=socio1;

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 21

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 22

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

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 24

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 25

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 26

27 Pasar por referencia para ser más eficiente Informática II 2011/2 27 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.

28 Ejemplo funciones por referencia using namespace std; void permutar1(int a, int b); void permutar2(int *ptr_a,int *ptr_b); void permutar3(int &a,int &b); int main(){ int num1=8; int num2=9; cout<<"Antes de utilizar la funcion1: "<<endl; cout<<"valor Variable1: "<<num1<<endl; cout<<"valor Variable2: "<<num2<<endl; Informática II 2011/2 28 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; //Paso de argumentos por valor //int a=num1, int b=num2 void permutar1(int a, int b){ int temp=a; a=b; b=temp; } //Paso de argumentos por referencia //mediante punteros // int *ptr_a=&num1, int *ptr_b=&num2 void permutar2(int *ptr_a,int *ptr_b){ int temp=*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){ int temp=a; a=b; b=temp; } return 0; }

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 29

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 30

31 Pasando punteros const Cuando se pasa un puntero de un objeto como parámetro de una función, ocurre el riesgo de modificar la variable y sus métodos. Para evitar este inconveniente se pueden usar punteros a objetos constantes, con el cual sólo se podrá usar los métodos constantes, protegiendo sus miembros. Informática II 2011/2 31

32 Ejemplo punteros constantes Informática II 2009/2 32 class myCicla3{ private: int color; public: myCicla3(); void setColor(int _color); int getColor() 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; } myCicla3::myCicla3(){ color=0; } myCicla3::~myCicla3(){} int myCicla3::getColor() const{ return color; } void myCicla3::setColor(int _color){ color=_color; }

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

34 Cuando usar referencias o punteros Informática II 2011/2 34 ReferenciasPunteros Las referencias generan un código mas limpio y fácil de usar Trabajan directamente con posiciones de memoria No pueden ser reasignadosSe pueden reasignar, (reuso de punteros) Las referencias no pueden ser nulas.Pueden tomar el valor de nulo en el flujo del programa Poco costoso para manejo de funciones.

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 35

36 Cuando usar referencias o punteros Las referencias generan un código mas limpio y fácil de usar; sin embargo, no pueden ser reasignados. En caso de tener que apuntar primero a un objeto y luego a otro, será necesario usar punteros. Las referencias no pueden ser nulas, por lo tanto si pueden existir cambios que lo conviertan en nulo, será necesario el uso de punteros. Informática II 2011/2 36

37 Informática II 2009/2 37

38 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/ 38 Informática II 2011/2

39 Informática II 2009/2 39


Descargar ppt "Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2."

Presentaciones similares


Anuncios Google