[C con Clase] Duda sobre el uso de & con clases.

Steven Davidson srd4121 en njit.edu
Mie Nov 16 15:21:08 CET 2011


Hola Miguel,

2011/11/16 Miguel Angel Torres Fernandez-piñar <miguelangeltorresfp en gmail.com>:
> Hola a todos....
>
> Me leo el apartado que habla sobre cómo pasar parámetros a una función y lo
> entiendo bien.
>
> Pero no entiendo por qué se tiene que usar & en este tipo de funciones
> relacionadas con las clases :
>

Veamos el código.

> Cadena &Cadena::operator=(const Cadena &c) {

Aquí, el símbolo & actúa como declarador; es decir, forma parte de una
declaración como parte del tipo de dato indicado:

- 'Cadena &' es el tipo de retorno: una referencia a un objeto
existente de la clase 'Cadena'

- 'const Cadena &' es el tipo del parámetro 'c': una referencia a un
objeto existente tratado como constante (sólo-lectura) de la clase
'Cadena'

Si no pasáremos el objeto por referencia, y lo hiciéramos por copia,

Cadena &Cadena::operator=( Cadena c );

entonces tal objeto se copiaría, instanciando otro objeto temporal y
local a esta función, lo que supondría invocar al constructor de
'Cadena'. Para ser tan eficiente como podamos, no nos interesa
realizar una copia de un objeto. Además, si el objeto es muy grande,
es posible que tengamos problemas a la hora de pasar tal objeto como
parámetro a una función; hay ciertos límites en cuanto al tamaño (en
bytes) de la lista de parámetros.

>    if(this != &c) {

Aquí, el símbolo & actúa como operador; es decir, conseguimos la
dirección de memoria del objeto 'c'.

Si 'c' fuere una copia, no podríamos usar esta comprobación, ya que no
habríamos obtenido el objeto original, sino una copia suya. Esto nos
forzaría a comprobar TODOS los valores dentro de 'c' con TODOS los
valores de "este objeto" apuntado por 'this'.

>       delete[] cadena;
>       if(c.cadena) {
>          cadena = new char[strlen(c.cadena)+1];
>          strcpy(cadena, c.cadena);
>       }
>       else cadena = NULL;
>    }
>    return *this;
> }
>


Espero haber aclarado la duda.

Steven




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