Estoy queriendo asegurarme de que entiendo correctamente el pass-by-value vs pass-by-reference. En particular, estoy buscando las versiones de prefijo/postfijo del operador de incremento ++
para un objeto.Operadores de incremento de prefijo/postfijo
Supongamos que tenemos la siguiente clase X
:
class X{
private:
int i;
public:
X(){i=0;}
X& operator ++(){ ++i; return *this; } //prefix increment
X operator ++ (int unused){ //postfix increment
X ret(*this);
i++;
return ret;
}
operator int(){ return i; } //int cast
};
En primer lugar, he implementado los operadores de incremento/postfix prefijo correctamente?
En segundo lugar, ¿qué tan eficiente es la memoria el operador postfix, en comparación con el operador de prefijo? Específicamente, ¿cuántas copias de objetos X
se crean cuando se utiliza cada versión del operador?
Una explicación de lo que sucede exactamente con retorno por referencia vs retorno por valor puede ayudarme a entender.
Editar: Por ejemplo, con el siguiente código ...
X a;
X b=a++;
... A y B son ahora los alias?
No hay necesidad de postfix-incrementar 'i' en el operador de posfijo. De hecho, haría lo que [sugiere FredOverflow] (http://stackoverflow.com/questions/3181211/3181359#3181359) y llamo a la versión de prefijo. IMO que es de hecho más idiomático que volver a implementar el incremento (aunque la implementación es trivial aquí). _Y deshazte de ese operador implícito de conversión. De lo contrario, te lastimará. (La tercera y última vez que escribí un operador de conversión implícita fue en 2001 y uno o dos años más tarde descubrí que causaba errores sutiles y lo eliminaba, como todos los anteriores. BTDTGTLS) – sbi