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.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Métodos y parámetros.
Curso de java básico (scjp)
Definición de Clases y Variables de referencia.
Abstracción de Datos Arrays.
Lenguaje de programación Java
Informática II Clase 12: Flujos Diego Fernando Serna Restrepo
FUNCIONES EN C.
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II Prof. Dr. Gustavo Patiño MJ
Programación en C (Segunda Parte) DATSI, FI, UPM José M. Peña
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Aplicación del paradigma orientado a objetos
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Implementación de Listas
Unidad 3 Punteros.
Curso Práctica 3 1 Funciones CONTENIDO Consideraciones sobre funciones Estructura de un programa en C Uso de funciones Paso de parámetros Punteros.
Acciones y funciones Concepto
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Funciones en lenguaje C
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
El lenguaje de programación C - Funciones -
Programación Orientada a Objetos usando C++
Modificadores.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
POO en C++ Programación Orientada a Objetos. Declaración de clases con struct Las clases en C++ pueden definirse utilizando la construcción struct Ejemplo:
 2003 Prentice Hall, Inc. All rights reserved. 1 Capítulo 6: Clases y Abstracción de Datos Índice del capítulo 6.1 Introducción 6.2 Estructuras 6.3 Clases.
Semana 5 Subprogramas..
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
Descomposición Modular. Funciones
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++. 2 PROYECTOS EN C++
Sobrecarga de operadores
El lenguaje de programación C - Vectores y matrices -
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
Herramientas de polimorfismo y herencia en C++
Introducción a los punteros Prof. Domingo Hernández.
Manejo de Punteros y objetos en memoria dinámica en C++
Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
Herencia y tipos ● Cuanta memoria se debe asignar a un objeto cuando se asigna en la pila ● La asignación debe hacerse antes de que se conozca la cantida.
Informática Ingeniería en Electrónica y Automática Industrial
Programación en C para electrónicos
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
Programación Orientada a Objetos
Sesión 09: Sobrecarga (1) /1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad.
Sesión 11: Herencia (1) – herencia simple /1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Términos algoritmo diseñar algoritmo implementar algoritmo
Detalles Generales sobre Java
Sesión 12: Herencia (2) – herencia múltiple /1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática.
Sesión 07: Manejo Dinámico de Memoria
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Fundamentos de Programación
INTRODUCCION A LA PROGRAMACION
Sesión 06: Clases y Objetos (2)
LENGUAJE “C” Programación.
El lenguaje C++ Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/
6. Clases y Métodos..  6.1 Structs  6.2 Funciones  6.3 Namespaces  6.4 Clases.
Algoritmo.
Corporación Universitaria del Caribe CECAR Fundamentos de programación II.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
MEMORIA DINÁMICA.
1 La sobrecarga de funciones y operadores le da al programador la oportunidad de asignar nuevos significados a las funciones y a los operadores.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Prof. Manuel B. Sánchez. Declaración de Objetos Una vez que la clase ha sido implementada se pueden declarar objetos como variables locales de métodos.
PROF. RAFAEL MONTENEGRO B. UNELLEZ-APURE Introducci Ó n a los Arreglos (“arrays”) en C++
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Transcripción de la presentación:

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

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

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

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

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

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

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

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

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

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

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 ++)

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 ++)

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 ++)

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 ++)

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 ++)

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 ++)

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 ++)

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

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

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

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

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

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 =

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; }

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

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  Pagina de Referencia lenguaje C++:  n/exception/ n/exception/  pt/ pt/  Sams Teach yourselft C++ in 21 days: g1 28