[C con Clase] Sobrecarga de operadores unitarios sufijos.

Steven Davidson srd4121 en njit.edu
Lun Feb 16 03:23:42 CET 2009


Hola Zaka,

Zakariae El-Abdelouarti wrote:
> Hola a todos!
> 
> Estoy leyendo este capítulo del curso de C++:
> http://c.conclase.net/curso/index.php?cap=035c
> 
> En el mismo (está copiado al final de este correo) existe un ejemplo 
> sobre el que tengo las siguientes preguntas:
> 
> 1) ¿Por qué la segunda declaración del operador ++ tiene como 
> argumento una variable de tipo int?
> 

Necesitamos distinguir una versión de la otra; es decir, el compilador 
necesita saber cuál operador sobrecargado invocar: preincremento o 
postincremento. Oficialmente, la versión sufija requiere que la función 
acepte un solo parámetro de tipo 'int'. Si no, el compilador no sabría 
cuál función elegir e invocar.

> 2) ¿Por qué esta variable no es usada en la implementación del
> operador?
> 

La respuesta sencillamente es que no tiene sentido usar tal parámetro. 
Recuerda que estos operadores son unitarios, lo que quiere decir que 
únicamente requieren un operando; y el operador ya lo tiene.

> En el mismo artículo hay un párrafo que dice:
> 
> "Cuando se usa un operador en la forma sufijo dentro de una
> expresión, primero se usa el valor actual del objeto, y una vez
> evaluada la expresión, se aplica el operador. Si nosotros queremos
> que nuestro operador actúe igual deberemos usar un objeto temporal, y
> asignarle el valor actual del objeto. Seguidamente aplicamos el
> operador al objeto actual y finalmente retornamos el objeto
> temporal."
> 
> 3) Seguramente no he logrado entender este párrafo tan intenso. Pero 
> he sacado la conclusión de que tenemos que elegir entre un
> comportamiento, prefijo o sufijo, dependiendo de la implementación 
> (usando objetos temporales o no) que hagamos.
> 

Este párrafo básicamente explica el comportamiento por defecto de los 
operadores prefijo y sufijo. Si queremos sobrecargar estos operadores, 
entonces normalmente los implementaremos para parecerse al 
comportamiento por defecto ya que suele ser el comportamiento esperado 
al usarlos. Por ejemplo,

Fecha fecha( 1, 3, 2009 );  // 1 de Marzo del 2.009

Fecha obj = fecha++;  // Agregamos póstumamente un día a 'fecha'

cout << fecha << endl;


En este caso, queremos el comportamiento esperado del incremento 
póstumo: la suma se realizará después de la expresión. Sin embargo, la 
implementación de este comportamiento debe realizarse ahora, en el 
momento de la evaluación.

La forma de lograr estos requisitos es retornar un nuevo objeto para 
emular el comportamiento póstumo. Sin embargo, cambiamos el estado del 
objeto original para que en sentencias posteriores refleje el incremento.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase