next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Ejercicio: Sobrecarga de Operadores Sup: Sobrecarga de Operadores Ant: Constantes Err: Si hallas una errata ...

Constructor de copia

La sobrecarga de operadores da lugar a confusión en ocasiones, supongamos por ejemplo que $d y $t son dos Math::BigFloat. Una asignación como:
$v = $d/$t;
trata a $d y $t como valores en vez de como las referencias que son a los correspondientes objetos. Consideremos una asignación como:
$v1 = $v;
La asignación hace que $v1 y $v sean una referencia al mismo objeto. Si posteriormente incrementamos $v1:
$v1++;
tendremos un efecto lateral, ya que $v se ve incrementado. Este efecto es, cuando menos, inconsistente con el uso normal de las operadores sobrecargados, en el sentido de que estos ``trabajan'' los referentes (objetos) y la asignación ``trabaja'' con las referencias.

Los operadores que cambian el valor de sus operandos se llaman ``mutantes''. El módulo overload proporciona un medio para interceptar a los mutantes y clonar los objetos que están siendo mutados de manera que la mutación sólo afecte a la copia del objeto. Esta intercepción se hace sobrecargando la operador engañosamente denominado =

package Math::BigFloat;

sub copy { Math::BigFloat->new(${$_[0]}) }

use overload
      ...
      '++' => "incr",
      '='  => "copy";
Esta sobrecarga no cambia la conducta del operador de asignación. La rutina copy es llamada antes que la subrutina asociada con cualqueir mutante. Asi pues, el código:

$v1++;

Se traduce por:

$v1 = $v1->copy(undef,"");
$v1->incr(undef,"");


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Ejercicio: Sobrecarga de Operadores Sup: Sobrecarga de Operadores Ant: Constantes Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21