La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sesión 09: Sobrecarga (1) 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad.

Presentaciones similares


Presentación del tema: "Sesión 09: Sobrecarga (1) 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad."— Transcripción de la presentación:

1 Sesión 09: Sobrecarga (1) 1

2 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 2 Sobrecarga de Funciones 1 Sobrecarga de Métodos 2 Sobrecarga de Constructores 3 4 Valores por defecto

3 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 3 Sobrecarga de Funciones

4 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Consiste en crear diferentes funciones con el mismo nombre, con el fin de ofrecer al usuario una manera más sencilla de recordar las funciones. TipoRetorno nomFuncion(Parametros 1); TipoRetorno nomFuncion(Parametros 2);... TipoRetorno nomFuncion(Parametros N); Donde: Los nombres de las funciones son iguales y Parametros 1 ≠ Parametros 2 ≠ … Parametros N 4 Sobrecarga de Funciones

5 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Sobrecarga de Funciones  Con el fin de que el mecanismo de sobrecarga sea independiente del contexto, los valores devueltos por las funciones NO son tenidos en cuenta a efectos del mecanismo de sobrecarga. int func (int, char); int func (float, char); void func (int, char); 5

6 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Cuando se realiza la invocación de una función sobrecargada, el compilador decide cual de ellas se utilizará mediante un proceso denominado resolución de sobrecarga ("Overload resolution").  Se resuelve aplicando ciertas reglas para verificar cuál de las declaraciones se ajusta mejor de acuerdo a:  número de argumentos  tipo de los argumentos utilizados. 6 Sobrecarga de Funciones

7 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  El proceso sigue unas reglas en el orden precedencia señalado: 1.Concordancia exacta en número y tipo. 2.Concordancia promociones de los tipos asimilables. Ejemplo: char, short, bool, a int. 3.Concordancia de conversiones estándar. Ejemplo: int a double; clase-derivada a clase-padre. 7 Sobrecarga de Funciones

8 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  El proceso sigue unas reglas en el orden precedencia señalado: 4.Concordancia de conversiones definidas por el usuario. 5.Concordancia usando la elipsis (...) en funciones con número variable de parámetros. 8 Sobrecarga de Funciones

9 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Ejemplo:  Complejo 9 Sobrecarga de Funciones

10 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 10 Sobrecarga de Funciones 1 Sobrecarga de Métodos 2 Sobrecarga de Constructores 3 4 Valores por defecto

11 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 11 Sobrecarga de Métodos

12 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  De la misma manera que ocurre con las funciones normales, en la definición de métodos puede ocurrir que varios métodos compartan el mismo nombre, pero difieran en el tipo y/o número de argumentos. De esta manera tendremos métodos sobrecargados. 12 Sobrecarga de Métodos

13 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Los métodos de las clases también pueden ser sobrecargados como el resto de las funciones, su sintaxis es prácticamente igual. class nombreClase { private: //Atributos public: //Métodos tipoRetorno nomMetodo (Parámetros 1); tipoRetorno nomMetodo (Parámetros N); }; 13 tipoRetorno nomMetodo (Parámetros 1); tipoRetorno nomMetodo (Parámetros N); Sobrecarga de Métodos

14 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Sobrecarga de Métodos class carro{ private: int gGas; char *marca; int velMax; int vel; bool start; public: carro(); void arrancar(); void acelerar(); void acelerar(int increment); void frenar(); int getVel() const; ~carro(); }; 14 void carro::acelerar(){ if(--gGas<=0){ vel=0; } else{ vel++; } } void carro::acelerar(int increment){ if(--gGas<=0){ vel=0; } else{ vel+=increment; } }

15 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Ejemplo:  Complejo 15 Sobrecarga de Métodos

16 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 16 Sobrecarga de Funciones 1 Sobrecarga de Métodos 2 Sobrecarga de Constructores 3 4 Valores por defecto

17 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Los constructores, al ser métodos especiales de las clases también pueden ser sobrecargados, y la manera de hacerlo es igual que el resto de los métodos.  ¡OJO!, los destructores no pueden ser sobrecargados, ¿Porque? 17 Sobrecarga de Constructores

18 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Sobrecarga de Constructores class carro{ private: int gGas; char *marca; int velMax; int vel; bool start; public: carro(); carro(int _gGas,char *_marca,int _velMax); void arrancar(); void acelerar(); void acelerar(int increment); void frenar(); int getVel() const; ~carro(); }; 18 carro::carro(){ gGas=0; marca=0; velMax=0; vel=0; start=false; } carro::carro(int _gGas,char *_marca, int _velMax){ gGas=_gGas; marca=_marca; velMax=_velMax; vel=0; }

19 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Ejemplo:  Complejo 19 Sobrecarga de Constructores

20 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Adicionalmente de ser declarados automáticamente un constructor y un destructor por cuando no son declarados explícitamente por el usuario, el compilador provee un constructor sobrecargado llamado de constructor copia, que es llamado cada vez que se requiere una copia de un objeto. 20 #include using namespace std; carro Deportivo(10,"BMW",50); //carro carreras=Deportivo; carro carreras(Deportivo); //constructor copia por defecto int main() { cout<<Deportivo.getVelMax()<<endl; cout<<carreras.getVelMax()<<endl; return 0; } 50 Constructores Copia

21 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Cada vez que se crea una copia de un objeto "El constructor de copia” es ejecutado.  Por defecto, el constructor de copia simplemente copia cada miembro de una objeto hacia el nuevo objeto. Esta copia se denomina “Copia Superficial”.  Sintaxis del constructor de copia nombreClase (const tipoClase &variable); Constructor (const Clase &Objeto); 21 Constructores Copia

22 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Ejemplo:  Complejo 22 Constructores Copia

23 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 23 La copia superficial es buena para casi todo tipo de variables; sin embargo, es muy fácil de romper cuando los atributos son punteros a datos en el Heap. Constructores Copia

24 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  La solución para evitar problemas ocasionados por las copias superficiales, es usando los constructores de copia para que estos hagan la copia en diferentes espacios del Heap, realizando lo que se denomina como “Copia Profunda”. 24 Constructores Copia

25 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 1 Cuando se pasa un objeto como argumento a una función o esta lo retorna, se hace una copia temporal de cada una de sus variables miembro. 2 Todo constructor de copia, toma como parámetro una referencia a un objeto de su misma clase. carro(const carro &deportivo); 25 Constructores Copia

26 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 3 El objetivo del constructor de copia, es crear una copia exacta de cada variable miembro del objeto pasado como referencia (original). Este copia se denomina “superficial”. 4 Los constructores de copia superficiales funciona perfectamente cuando se trata de un objeto cuyos atributos no son punteros referenciados a variables u objetos alojados en el Heap (free store). 5 En algunas ocasiones se hace necesario definir personalmente un constructor de copia, que evite que se haga una copia errónea, donde se garantice la independencia de cada objeto con respecto a cada una de sus variables miembro (copia profunda). 26 Constructores Copia

27 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Constructores Copia class carro{ private : int *gGas; char *marca; const int velMax; int vel; bool start; public : carro(); carro(int _gGas,char *_marca,int _velMax); //se declara el constructor de copia. carro(const carro &original); void arrancar(); void acelerar(); void acelerar(int increment); void frenar(); int getVel() const; int getVelMax() const; int getgGas() const; void setVelMax(int vel); ~carro(); }; 27 //constructor por defecto //incializacion en la etapa de inicialización carro::carro():gGas(0),marca(0),velMax(0),\ vel(0), start(false){ gGas=new int; } //El otro constructor //inicialización en la etapa de inicialización carro::carro(int _gGas,char *_marca, int _velMax): marca(_marca), velMax(_velMax){ gGas=new int; *gGas=_gGas; } //constructor de copia carro::carro(const carro &original):velMax(original.velMax){ //se hace una copia de cada una de las variables miembro marca=original.marca; vel=original.vel; start=original.start; gGas=new int; *gGas=original.getgGas(); } // Declaración de los otros métodos int carro::getVelMax() const{ return velMax; } carro::~carro(){ //Destructor delete gGas; gGas=0;//NULL } #include using namespace std; char marca[]= "BMW”; carro Deportivo(10,marca,50); carro carreras(Deportivo); //carro carreras=Deportivo; int main() { cout<<Deportivo.getVelMax()<<endl; cout<<carreras.getVelMax()<<endl; return 0; } 50

28 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 28 Sobrecarga de Funciones 1 Sobrecarga de Métodos 2 Sobrecarga de Constructores 3 4 Valores por defecto

29 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia En el código anterior tenemos que uno de los constructores tiene argumentos de entrada planteados por defecto carro(int _gGas,char *_marca="mazda", int _velMax=80); carro Deportivo(10,"Renault"); Aquí no asignamos el último parámetro (int _velMax) al constructor, este es asignado por defecto como 80. 29 Valores por Defecto

30 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia No es posible en la llamada de este constructor en particular, por ejemplo asignar un valor al tercer argumento si no ha sido asignado antes el valor del segundo argumento por defecto. carro Deportivo(10,,50); //no tiene sentido En cualquier función, o método de una clase es posible instaurar los argumentos por defecto. 30 Valores por Defecto

31 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 31

32 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Bibliografía  Curso C++ con clase http://c.conclase.net/curso/?cap=043 http://c.conclase.net/curso/?cap=043  Pagina de Referencia lenguaje C++:  http://www.cplusplus.com/reference/std/exceptio n/exception/ http://www.cplusplus.com/reference/std/exceptio n/exception/  http://www.cplusplus.com/reference/std/stdexce pt/ http://www.cplusplus.com/reference/std/stdexce pt/  Sams Teach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm#Headin g1 32


Descargar ppt "Sesión 09: Sobrecarga (1) 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad."

Presentaciones similares


Anuncios Google