Upload
claudia-blanco-rubio
View
230
Download
0
Embed Size (px)
Citation preview
1
Informática IISesión 09: Sobrecarga (1)
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
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
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
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
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
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
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
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
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
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
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
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
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;}
}
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
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
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
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;
}
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
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
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
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
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
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
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
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
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
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
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
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
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
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