[C con Clase] ¿que significa la sentencia .....return *this
Steven Davidson
srd4121 en njit.edu
Lun Sep 20 22:41:55 CEST 2010
Hola Wolverine,
On 9/20/2010 4:02 PM, wolverine_ch wrote:
> bueno ya veo ...
>
> ahora con respecto a esto...
> SD> Personalmente, habría usado una referencia para el parámetro, 'P', por
> SD> lo que sería,
> SD> vector& vector::operator+( const vector&P )
> SD> {
> SD> x += P.x;
> SD> y += P.y;
> SD> return *this;
> SD>
>
> es lo mismo que si hago esto?:.....
> vector& vector::operator+( const vector *P )
> {
> x += P->x;
> y += P->y;
> return *this;
> }
>
No; no es lo mismo. Aquí estás diciendo que el parámetro, 'P', es un
puntero. Esto significa que el parámetro es una dirección de memoria.
Con esto, sí puedes lograr el mismo resultado, pero no usaríamos el
operador + de la misma manera. Por ejemplo,
vec1 + &vec2;
Puedes hacer esto, pero no resulta muy cómodo ni tampoco es muy legible.
Nos gustaría hacer algo parecido a la suma con variables de los tipos
fundamentales; así:
int num1 = 2, num2 = 4;
num1 + num2;
Sería engorroso tener que escribir esto:
num1 + &num2;
> bueno esque cuando trabaje con estructuras hice pilas estaticas
> y cuando pasaba la pila como paramaetro hacia esto:
>
> funcion(&PILA);
>
> Y el prototipo de la funcion la hacia asi
> void funcion(*PILA){
> PILA->dato /*asi accedia al dato*/
> }
>
> yo pregunto ...esto significa lo mismo alo que tu me dices??
>
Quiero aclarar que una referencia no es más que un sobrenombre (un
alias) para una variable. Por ejemplo,
int num = 10;
int &ref = num;
'ref' y 'num' se refieren a la misma variable en memoria que contiene el
valor de 10. Por lo tanto, la dirección de memoria de ambas referencias
es la misma. Prueba esto:
if( &ref == &num )
cout << "Obviamente sus direcciones de memoria son iguales" << endl;
else
cout << "Esto es imposible" << endl;
En cuanto a tu ejemplo, esto está bien si quieres manipular punteros. En
C, no tienes más remedio que usar punteros para pasar información que
quieres modificar dentro de una función, porque no existe el paso por
referencia como tal. En C++, sí existe el paso por referencia, y por
tanto podrías haber optado por pasar esa estructura por referencia. Esto
sería,
void funcion( pila_t &refPila )
{
refPila.dato = 10;
}
int main()
{
pila_t Pila;
funcion( Pila );
...
}
Sin embargo, es una buena práctica de diseño no abusar del paso por
referencia. Esto es porque al leer el código fuente uno no sabe a
ciencia cierta si los parámetros van a ser modificados o no, si son
pasados por referencia. Por ejemplo,
int num = 5;
func( num );
Sin ver el prototipo no sabemos si se pasa por copia o por referencia.
Si esperamos un puntero, entonces tendremos que aplicar el operador &
para pasar la dirección de memoria de tal parámetro. Esto es,
int num = 5;
func2( &num );
Aquí sospechamos que el contenido de 'num' va a ser modificado porque la
función acepta un puntero.
Por otra parte, a veces nos interesa pasar la información por referencia
y así invocamos la función sin tener que hacer nada con el parámetro.
Como ya hemos visto,
func( num );
Es posible que se pase por copia o por referencia, pero al menos no
tenemos que agregar operadores al parámetro.
Espero haber aclarado la duda.
Steven
Más información sobre la lista de distribución Cconclase