[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