• No se han encontrado resultados

Metodos operadores

N/A
N/A
Protected

Academic year: 2020

Share "Metodos operadores"

Copied!
9
0
0

Texto completo

(1)

1

1. Sobrecarga de operadores

2. Métodos operadores unarios

Operador de incremento (prefijo)

3. Devolución de objetos en los métodos. Retorno por referencia

Métodos operadores

Sobrecarga de operadores

Los operadores aceptan uno o varios operandos de tipo específico, produciendo y/o modificando un valor de acuerdo con ciertas reglas.

C++ permite redefinir la mayor parte de los operadores, es decir, permite que los operandos no sean tipos básicos, sino tipos definidos por el programador y seguir otro comportamiento.

Los operadores conservan el sentido y comportamiento originales cuando se usan con los tipos básicos.

(2)

3

Operadores sobrecargables

El lenguaje C++ permite redefinir la funcionalidad de los siguientes operadores:

+ - * / % ^ = += - = *= /= %= == != <= >= < >

&& || ++ -- ->* new new[] delete delete[]

Hay más ...

.

Operador punto

::

Operador de acceso a ámbito # y # # Directivas de preprocesado

Operadores NO sobrecargables

Hay más ...

Métodos operadores

Métodos operadores binarios

operador + : para sumar fracciones,

operador - : para restar fracciones,

operador * : para multiplicar fracciones,

operador / : para dividir fracciones

Fraccional operator + ( Fraccional f );

FraccionalFraccional :: operator + (Fraccional f ) {

Fraccional aux;

aux.numerador = numerador * f.denominador + denominador * f.numerador; aux.denominador = denominador * f.denominador;

aux. simplifica(); return aux; }

Prototipo Paso de parámetro por copia

Retorno

(3)

5

Métodos operadores binarios

class Fraccional

{

private:

int numerador ; int denominador ;

void simplificar( ) ;

public:

Fraccional(int n=0, int d=1);

Fraccional operator + ( Fraccional f );

Fraccional operator -(Fraccional f); Fraccional operator *(Fraccional f); Fraccional operator /(Fraccional f); int ac_numerador( );

int ac_denominador( );

void mu_numerador (int n); void mu_denominador ( int d); } ;

void main() {

Fraccional f1(1,2), f2(2,1), f3; f3 = f1 + f2 ;

... ...

...

f3 = f1. operator + ( f2 ) ; ...

Métodos operadores

Métodos operadores unarios

Existen métodos que modifican el objeto receptor del mensaje.

Vamos a jugar con el operador incremento prefijo (operador ++)

operador ++ operador

--operador += operador -=

operador *= operador /=

Modifica el objeto receptor pero no devuelve nada.

void operator ++ ( );

n

Prototipo

void Fraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

(4)

7

Comportamiento

void operator ++ ( );

n

void Fraccional :: operator ++ ( )

{

numerador = numerador + denominador ; simplifica() ;

} Modifica el objeto receptor

pero no devuelve nada.

...

Fraccional f1(1, 1); ++f1;

...

Modifica adecuadamente el objeto receptor

Se puede utilizar para incrementar un Fraccional

++(++f1) ; f2 = ++f1 ; ...

Se impide encadenar operaciones

ERROR

Nada que incrementar

ERROR Nada que asignar

Métodos operadores

Modifica adecuadamente el objeto receptor

Se puede utilizar para incrementar un Fraccional y asignar el resultado a otro Fraccional

Fraccional operator ++ ( );

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ; }

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++f1;

f2 = ++f1 ; ...

++(++f1) ;

Seguimos teniendo un problema, el método modifica el objeto y devuelve una copia del objeto receptor.

(5)

9

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ; }

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ;

++(++f1) ;

Comportamiento

f1

numerador

denominador 1

1

Métodos operadores

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ;

simplifica() ; return *this ; }

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

(6)

11

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ; }

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

1

Métodos operadores

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ;

}

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

1

Devolución por valor Se devuelve una copia del objeto

receptor Resultado de la

función

numerador

denominador 2

1

(7)

13

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ;

simplifica() ; return *this ; }

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

1

Resultado de la función

numerador

denominador 3

1

tmp1

El segundo incremento se realiza sobre la copia que

devuelve el primero.

Métodos operadores

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ;

}

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

1

Resultado de la función

numerador

denominador 3

1

Devolución por valor Se devuelve una copia del objeto receptor, es decir, se

devuelve una copia de la copia.

Resultado de la función

numerador

denominador 3

1

(8)

15

o

FraccionalFraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ;

}

Método operador que devuelve un nuevo objeto

...

Fraccional f1(1, 1) ; ++(++f1) ;

Comportamiento

f1

numerador

denominador 2

1

Resultado de la función

numerador

denominador 3

1

No se obtiene el resultado deseado, ya que el segundo incremento se realiza sobre la

copia que devuelve el primero.

Resultado de la función

numerador

denominador 3

1

tmp2 tmp1

Métodos operadores

Modifica adecuadamente el objeto receptor y se devuelve el mismo como resultado de la ejecución del método, de forma que cualquier nueva operación se realiza sobre el resultado de ésta

operación, se efectúa sobre ese mismo objeto.

Fraccional & operator ++ ( );

p

Fraccional& Fraccional :: operator ++ ( ) {

numerador = numerador + denominador ; simplifica() ;

return *this ; }

Método operador que devuelve el objeto receptor

...

Fraccional f1(1, 1) ; ++f1;

f2 = ++f1 ; ++(++f1); ...

Se devuelve el propio objeto receptor, no una copia.

(9)

17

Retorno de funciones

‹ Retorno estándar

En un retorno estándar, el retorno de la función es un objeto temporal que se crea para almacenar el valor que se devuelve. La

existencia de éstos objetos temporales está ligada a la expresión donde se realiza la invocación.

‹ Retorno de referencias

El modificador & junto con el tipo que devuelve la función, indica éste tipo de retorno.

En un retorno de referencias, no se crea ningún objeto temporal, el valor que se devuelve se almacena en el objeto que realiza la invocación.

Métodos operadores

El operador +=

Fraccional & operator +=( Fraccional f );

Fraccional & Fraccional :: operator += (Fraccional f ) {

numerador = numerador * f.denominador + denominador * f.numerador; denominador = denominador * f.denominador; simplifica();

return *this; }

void main() {

Fraccional f1(1,2), f2(2,1); f1 += f2 ;

...

...

f1. operator += ( f2 ) ; ...

Devuelve el propio objeto

Referencias

Documento similar

A través del departamento técnico comercial, formado por ingenieros con un alto nivel de conocimiento del producto, atendemos las solicitudes de medida de caudal y nivel y

Ahora ve:.. El ayudante de cocina ayudó a la reconocida cocinera con la presentación del plato.. Preparando la presentación del plato, el ayudante de cocina ayudó a la

Definición de la semántica (significado de las operaciones) Operación: es una función que toma como parámetros (entrada) cero o más valores de diversos tipos, y produce como

Este libro intenta aportar al lector una mirada cuestiona- dora al ambiente que se desarrolló en las redes sociales digitales en un escenario de guerra mediática mantenido por

o esperar la resolución expresa&#34; (artículo 94 de la Ley de procedimiento administrativo). Luego si opta por esperar la resolución expresa, todo queda supeditado a que se

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

Como en el caso de los tipos enteros, los lenguajes suelen soportar varios tipos real, de modo que el programador pueda seleccionar aquel cuyo rango y precisi´on en el coeficiente

El problema de dar una descripci´ on general de los operadores que preservan ortogonalidad entre C ∗ -algebras permaneci´ o abier- to hasta 2008. En este a˜ no, y en colaboraci´ on