Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porClaudia Blanco Rubio Modificado hace 8 años
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
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.