La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sesión 10: Sobrecarga (2) 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 10: Sobrecarga (2) 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 10: Sobrecarga (2) 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 Operadores 1 Sobrecarga de un operador 2 Sobrecarga de dos operadores 3

3 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  La sobrecarga de operadores permite redefinir algunos de los operadores existentes en C++ para que actúen de una determinada manera.  La manera de trabajar es definida por el programador como.  Métodos de los objetos de una clase creada por el mismo.  Funciones externas a las clases. 3 S OBRECARGA DE OPERADORES

4 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  La sobrecarga de operadores se emplea para declarar “cómo es que funciona” dicho operador.  Cuando sobrecargamos cualquier operador nos referimos a cambiar su funcionalidad pero no su gramática original.  Así por ejemplo:  Suma:a + b;a+;  Asignación:a = a+b;a + b = a; 4 S OBRECARGA DE OPERADORES

5 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Cuando en C++ determinamos el uso de un operador : +, -, *, /, %, =, <, …  Estamos haciendo uso de funciones con identificadores (nombres) especiales. +→operator+ -→operator- *→operator* 5 S OBRECARGA DE OPERADORES

6 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  La sobrecarga de un operador puede ser declarada de la siguiente forma: tipodeRetorno operator op (parametros); 6 // Ejemplo declaración para el sobrecargado del operador + float operator+ (float x); Void, int, char, … Palabra reservada Palabra reservada -, --, +, ++, =, ==, … Void, int, char, … S OBRECARGA DE OPERADORES

7 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Suponiendo que tenemos tres objetos de una misma clase: c1, c2, c3 c3 = c1.suma(c2);  Sería más sencillo utilizar la sobrecarga de operadores: c3 = c1.operator+(c2); c3 = c1+ c2; 7 S OBRECARGA DE OPERADORES

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 objetivo de la sobrecarga de operadores es simplificar al máximo el código a implementar.  A cambio agregar algunas definiciones en las clases.  Una clase que disponga de operadores sobrecargados es una clase más compleja de definir, pero más sencilla e intuitiva de utilizar. 8 S OBRECARGA DE OPERADORES

9 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Existen dos clases de sobrecargas:  De un operador  De dos operadores 9 S OBRECARGA DE OPERADORES

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 Operadores 1 Sobrecarga de un operador 2 Sobrecarga de dos operadores 3

11 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  La sobrecarga puede ser empleada para redefinir las operaciones unitarias. Algunas de ellas son: += -= *= /= %= ^= &= |= ++ -- entre otras  Los operadores de un operador realizan modificaciones sobre los mismos objetos que llaman dicha función. 11 Sobrecarga de un Operador

12 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 un Operador (pre ++) class Contador{ private: int x; int y; public: //constructores Contador(); Contador(const Contador& original); //Obtener y Asignar int getX() const {return x;} int getY() const {return y;} void setX(int _x); void setY(int _y); //Otros Métodos void incrementar(); //sobrecargar el operador void operator++(); // -> cont++; ~Contador(); }; 12 //constructor por defecto Contador::Contador(): x(0),y(0){} //constructor de copia Contador::Contador(const Contador& original){ x=original.x; y=original.y; } void Contador::setX(int _x){ x=_x; } void Contador::setY(int _y){ y=_y; } void Contador::incrementar(){ x=x+2; y=y+4; } //definición sobrecarga del operador preincremento (++i) void Contador::operator++(){ x=x+2; y=y+4; } //Destructor contador::~contador(){} #include using namespace std; int main(){ Contador mycontador(); mycontador.incrementar(); cout<<“Metodo Incrementar: ”<< mycontador.getX()<<“,”<<mycontador.getX()<<endl; ++mycontador; cout<<“Operador ++: " << mycontador.getX()<<“,”<<mycontador.getX()<<endl; return 0; } Metodo Incrementar: 2,4 Operador ++: 4,8

13 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Ahora lo que generalmente se desea es poder es retornar un objeto tipo contador, de este modo poder reasignarlo a otro objeto tipo contador. 13 //definición de la operador preincremento (++i) Contador Contador::operator++(){ x=x+2; y=y+4; Contador temp; temp.setX(x); temp.setY(y); return temp; } using namespace std; int main(){ Contador cont1; cont1.incrementar(); cout<<"cont1: " <<cont1.getX()<<“,”<<cont1.getY()<<endl; Contador cont2=++cont1; cout<<"cont2: " <<cont2.getX()<<“,”<<cont2.getY()<<endl; return 0; } cont1: 2,4 cont2: 4,8 Sobrecarga de un Operador (pre ++)

14 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Pero por qué crear un objeto temporal?  Recordemos que cada objeto temporal debe ser:  Construido  Copiado  Destruido luego del retorno del método  Cada operación de estas muy costosa computacionalmente hablando. 14 Sobrecarga de un Operador (pre ++)

15 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  El objeto cont1 ya existe y posee un valor adecuado para las variables, porque no retornar a sí mismo mediante el puntero this.  *this es el objeto.  this es la dirección del objeto. 15 //definición de la operador preincremento (++i) Contador Contador::operator++(){ x=x+2; y=y+4; return *this; } Sobrecarga de un Operador (pre ++)

16 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 1 A través del objeto cont1, se llama el método que sobrecarga el operador preincremento (++). 2 Dicho método incrementa las variables, y se retorna a sí mismo (contador). 3 Se llama el constructor de copia del objeto cont2, el cual recibe como argumento por defecto la referencia de un objeto del mismo tipo (cont1). 16 En esta línea de código se presenta los siguientes pasos: contador cont2=++cont1; Sobrecarga de un Operador (pre ++)

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 operadores posfijos son los que primero devuelven el valor y luego opera la variable, ejemplo: i++;  Para sobrecargar el operador posfijo en los objetos, es necesario el uso de objetos temporales dentro de los métodos para luego devolverlos por valor. 17 Sobrecarga de un Operador (pos ++)

18 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Declaración Contador Contador::operator++(int flag) { Contador temp(*this); x=x+2; y=y+4; return temp; } /* Notese el uso de la variable flag... dicha vble es declarada pero ¡¡nunca es utilizada!! */ 18 flag tipo int tiene valor 0 y no se utiliza nunca, solo sirve como criterio de distinción frente al operador de preincremento. Sobrecarga de un Operador (pos ++)

19 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 1 Creamos un objeto temporal copia del objeto original. 2 Modificamos el valor de la variable del objeto original. 3 Retornamos el objeto copia temporal. 19 De este modo, el valor del objeto será modificado, pero en la expresión donde aparezca se tomará el valor antes de modificar. Sobrecarga de un Operador (pos ++)

20 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 un Operador (pos ++) class Contador{ private: int x; int y; public: //constructores Contador(); Contador(const Contador& original); //Obtener y Asignar int getX() const {return x;} int getY() const {return y;} void setX(int _x); void setY(int _y); //Otros Métodos void incrementar(); //sobrecarga el operador preincremento (++i) Contador operator ++(); //sobrecarga del operador posincremento (i++) Contador operator ++(int flag); ~Contador(); }; 20 //Constructor Contador::Contador():x(0),y(0){} //constructor de copia contador::contador(contador& original){ x=original.x; y=original.y; } int Contador::getX() const{ return X; } int Contador::getY() const{ return Y; } void Contador::setX(int _x){ x=_x; } void Contador::setY(int _y){ y=_y; } void Contador::incrementar(){ x=x+2; y=y+4; } //definicion de la operador preincremento (++i) Contador Contador::operator++(){ x=x+2; y=y+4; return *this; } //definicion del operador posincremento (i++) Contador Contador::operator++(int flag){ //copia del objeto Contador temp(*this); x=x+2; y=y+4; return temp; } using namespace std; int main() { contador cont1; cont1.incrementar(); cout<<“Metodo Incrementar: "<< cont1.getX()<<“,”<< cont1.getY()<< endl; contador cont2=++cont1; cout<<“Preincremento cont1: "<< cont1.getX()<<“,”<< cont1.getY()<< endl; cout<<“Valor de cont2: "<< cont2.getX()<<“,”<< cont2.getY()<< endl; cont2=cont1++; cout<<“Posincremento cont1: "<< cont1.getX()<<“,”<< cont1.getY()<< endl; cout<<“Valor de cont2: "<< cont2.getX()<<“,”<< cont2.getY()<< endl; return 0; } Metodo Incrementar: 2,4 Preincremento cont1: 4,8 Valor de cont2: 4,8 Posincremento cont1: 6,12 Valor de cont2: 4,8

21 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia 1 Un operador puede estar sobrecargado o redefinido varias veces, de tal manera que actúe de un modo distinto dependiendo del tipo de objetos que tenga como argumentos de entrada. 2 Las ventajas de la sobrecarga de operadores terminan cuando se utiliza de modo que añade complejidad o confusión a los programas. Por ejemplo: no se deberá nunca utilizar el operador (-) para multiplicar matrices o el (+) para imprimir vectores. 3 Los únicos operadores de C++ que no se pueden sobrecargar son: El operador punto (.), El if aritmético (?:) El operador sizeof, El scope operator (::) puntero a miembro de un objeto (.*). 21 Sobrecarga de un Operador

22 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 22 Sobrecarga de Operadores 1 Sobrecarga de un operador 2 Sobrecarga de dos operadores 3

23 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia O PERADORES B INARIOS  Son aquellos que requieren dos operandos, como la suma o la resta. Cuando se sobrecargan operadores en el interior se asume que el primer operando es el propio objeto de la clase donde se define el operador. Debido a esto, sólo se necesita especificar un operando como argumento. 23

24 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia S OBRECARGANDO EL OPERADOR + class Contador{ private: int x; int y; public: //constructores Contador(); Contador(int _x, int _y); Contador(Contador& original); //Asignar y Obtener int getX() const {return x}; int getY() const {return y}; void setX(int _x); void setY(int _y); void incrementar(); //sobrecarga el operador + Contador operator+(const Contador& c); ~Contador(); }; 24 contador::contador():x(0),y(0){} contador::contador(int _x, int y):x(_x),y(_y){} //constructor de copia contador::contador(contador& original){ x=original.x; y=original.y; } void contador::setX(int _x){ x=_x; } void Contador::setY(int _y){ y=_y; } void Contador::incrementar(){ x=x+2; y=y+2; } //definición del operador + Contador Contador::operator+(const Contador& c){ Contador temp; temp.setX(variable+c.getX()); temp.setY(variable+c.getY()); return temp; } Contador::~Contador(){} using namespace std; //Ejemplo operador + int main() { contador cont1(5,3),cont2(6,9); contador cont3=cont1+cont2; cout<<"el valor de cont1 es: "<<cont1.getX()<<“,”<<cont1.getY()<<endl; cout<<"el valor de cont2 es: "<<cont2.getX()<<“,”<<cont2.getY()<<endl; cout<<"el valor de cont3 es: "<<cont3.getX()<<“,”<<cont3.getY()<<endl; return 0; } el valor de cont1: 5,3 el valor de cont2: 6,9 el valor de cont3: 11,112

25 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia  Qué pasa si el objeto cont1 tiene como variables miembro punteros que acceden a memoria dinámica?  El objeto cont2 al ser de la misma clase que cont1 igualmente ya cuenta con espacio en memoria dinámica, luego solo basta con copiar el nuevo valor respectivo en dicho espacio. 25 int main() { contador cont1(5,3),cont2(6,9); cont2=cont1; cout<<"el valor de cont1 es: "<<cont1.getX()<<“,”<<cont1.getY()<<endl; cout<<"el valor de cont2 es: "<<cont2.getX()<<“,”<<cont2.getY()<<endl; return 0; } S OBRECARGANDO EL OPERADOR =

26 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia S OBRECARGANDO EL OPERADOR = 26 //sobrecarga el operador = const contador& operator =(const contador &c); //definicion del operador = const contador& contador::operator =(const contador &c){ if(this==&c){ return *this; } else{ x=c.x; y=c.y; } return *this; }

27 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Resumen  Así, cuando hacemos la sobrecarga de un operador y realizamos su llamado nos referimos a: 27

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


Descargar ppt "Sesión 10: Sobrecarga (2) 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