sesión 09: sobrecarga (1) 1. 2009/1 circuitos digitales iii 2010/1 circuitos digitales iii 2010/1...

32
Informática II Sesión 09: Sobrecarga (1) 1

Upload: claudia-blanco-rubio

Post on 24-Jan-2016

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

1

Informática IISesión 09: Sobrecarga (1)

Page 2: 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

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

CONTENIDOCONTENIDO

2

Sobrecarga de Funciones1

Sobrecarga de Métodos2

Sobrecarga de Constructores3

4 Valores por defecto

Page 3: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia3

Sobrecarga de FuncionesSobrecarga de Funciones

Page 4: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 FuncionesSobrecarga de Funciones

Page 5: 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

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

Sobrecarga de FuncionesSobrecarga 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

Page 6: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 FuncionesSobrecarga de Funciones

Page 7: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 FuncionesSobrecarga de Funciones

Page 8: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 FuncionesSobrecarga de Funciones

Page 9: 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

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

Ejemplo: Complejo

9

Sobrecarga de FuncionesSobrecarga de Funciones

Page 10: 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

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

CONTENIDOCONTENIDO

10

Sobrecarga de Funciones1

Sobrecarga de Métodos2

Sobrecarga de Constructores3

4 Valores por defecto

Page 11: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia11

Sobrecarga de MétodosSobrecarga de Métodos

Page 12: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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étodosSobrecarga de Métodos

Page 13: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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étodosSobrecarga de Métodos

Page 14: 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

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

Sobrecarga de Métodos 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;}

}

Page 15: 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

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

Ejemplo: Complejo

15

Sobrecarga de MétodosSobrecarga de Métodos

Page 16: 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

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

CONTENIDOCONTENIDO

16

Sobrecarga de Funciones1

Sobrecarga de Métodos2

Sobrecarga de Constructores3

4 Valores por defecto

Page 17: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 ConstructoresSobrecarga de Constructores

Page 18: 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

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

Sobrecarga de ConstructoresSobrecarga de Constructoresclass 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;

}

Page 19: 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

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

Ejemplo: Complejo

19

Sobrecarga de ConstructoresSobrecarga de Constructores

Page 20: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 <iostream>using namespace std;carro Deportivo(10,"BMW",50);//carro carreras=Deportivo;carro carreras(Deportivo); //constructor copia por

defectoint main(){

cout<<Deportivo.getVelMax()<<endl;cout<<carreras.getVelMax()<<endl;return 0;

}

5050

Constructores CopiaConstructores Copia

Page 21: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 CopiaConstructores Copia

Page 22: 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

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

Ejemplo: Complejo

22

Constructores CopiaConstructores Copia

Page 23: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia23

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 CopiaConstructores Copia

Page 24: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 CopiaConstructores Copia

Page 25: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 CopiaConstructores Copia

Page 26: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 CopiaConstructores Copia

Page 27: 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

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

Constructores CopiaConstructores Copiaclass 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óncarro::carro():gGas(0),marca(0),velMax(0),\

vel(0), start(false){gGas=new int;

}

//El otro constructor//inicialización en la etapa de inicializacióncarro::carro(int _gGas,char *_marca, int _velMax):

marca(_marca), velMax(_velMax){gGas=new int;*gGas=_gGas;

}

//constructor de copiacarro::carro(const carro

&original):velMax(original.velMax){//se hace una copia de cada una de las variables

miembromarca=original.marca;vel=original.vel;start=original.start;gGas=new int;*gGas=original.getgGas();

}

// Declaración de los otros métodosint carro::getVelMax() const{

return velMax;}

carro::~carro(){ //Destructordelete gGas;gGas=0; //NULL

}

#include <iostream>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;

}

5050

Page 28: 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

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

CONTENIDOCONTENIDO

28

Sobrecarga de Funciones1

Sobrecarga de Métodos2

Sobrecarga de Constructores3

4 Valores por defecto

Page 29: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 DefectoValores por Defecto

Page 30: 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

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informá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 DefectoValores por Defecto

Page 31: 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

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

GRACIAS POR SU ATENCIÓN

31

Page 32: 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

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

BibliografíaBibliografía Curso C++ con clase

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/stdexcep

t/ Sams Teach yourselft C++ in 21 days:

http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1

32