Thread View: es.comp.os.linux.programacion
2 messages
2 total messages
Started by Roberto C. Lozano
Sat, 11 Sep 1999 00:00
Paso de objetos "por valor" a m�todos en JAVA. Se puede ???
Author: Roberto C. Lozano
Date: Sat, 11 Sep 1999 00:00
Date: Sat, 11 Sep 1999 00:00
19 lines
1092 bytes
1092 bytes
Hola, me gustaria saber si hay alguna forma de pasar un objeto como par�metro de un m�todo "por valor" y no "por referencia". Si no pudiera hacerse, que deberia hacer ????. Crear una copia del objeto, dentro del m�todo, y operar con la copia???. Para crear la copia, deberia sobrecargar el operador "=" (como se hace en Java?) o existe alguna forma m�s rapida y limpia de clonar un objeto???? Gracias por atenderme, espero que podais ayudarme. Roberto Carlos Lozano L�pez. <rclozano@norba.unex.es>
Re: Paso de objetos "por valor" a métodos en JAVA. Se puede ???
Author: Luis Paúl Tomillo
Date: Mon, 13 Sep 1999 00:00
Date: Mon, 13 Sep 1999 00:00
156 lines
4835 bytes
4835 bytes
Roberto C. Lozano <rclozano@norba.unex.es> wrote:
> Hola,
> me gustaria saber si hay alguna forma de pasar
> un objeto como par�metro de un m�todo "por valor"
> y no "por referencia".
> Si no pudiera hacerse, que deberia hacer ????.
> Crear una copia del objeto, dentro del m�todo, y operar
> con la copia???.
> Para crear la copia, deberia sobrecargar el operador "=" (como se hace en
> Java?)
> o existe alguna forma m�s rapida y limpia de clonar un objeto????
> Gracias por atenderme, espero que podais ayudarme.
> Roberto Carlos Lozano L�pez.
> <rclozano@norba.unex.es>
Constructores de copia, par�metros por referencia y por valor en C++
Mini-mini-howto
--------------------------------------------------------------------
- Clonaci�n o copia de objetos
Al programar con objetos en C++, o en cualquier otro lenguaje orientado a
objetos, muchas veces surge la necesidad de poder hacer copias, clones
exactos de otros objetos. Afortunadamente, C++ da soporte para lo anterior
sin demasiadas complicaciones.
Supongamos el siguiente objeto:
class X {
int a,b;
public:
X() {} // constructor
// metodos p�blicos (interfaz)
...
};
La gram�tica de C++ permite realizar una copia del objeto tal cual. Por
ejemplo:
X x1;
X x2;
x2 = x1;
Con lo anterior se copia el contenido del espacio de memoria ocupado por
los datos de x1 en el espacio de memoria para el objeto x2. Por tanto, se
realiza una copia exacta del objeto. Esta forma de copiar es v�lida
pero no lo es en todos los casos.o es v�lido pero no lo es en todos los
casos. Por ejemplo, supongamos que un dato miembro del objeto X es un
puntero. Entonces se copiar�a el valor del puntero directamente. Es decir,
como resultado de la copia se tendr�an dos objetos con un dato miembro
puntero que apunta al mismo sitio. Normalmente, esto provocar�a resultados
desastrosos. Para solucionarlo puede sobrecargarse el operador =:
class X {
int *p;
int a,b;
public:
X() {}
X& operator=(const X& x)
{
// liberar p y hacer otras tareas necesarias
...
// asignar nuevamente el puntero p
...
// copiar memoria apuntada por x.p en p
...
a = x.a;
b = x.b;
return *this;
}
};
De todas formas, la mejor forma de crear una copia o clon de un objeto, es
usar un constructor de copia. La ventaja fundamental es que no es necesario
realizar operaciones de liberaci�n de memoria y otros recursos durante la
copia (tal y como ocurr�a en la sobrecarga del operador =) ya que �sta
se realiza en el momento de la creaci�n del objeto:
class X {
int a,b;
public:
X() {} // constructor por defecto
X(const X& x)
{
a = x.a;
b = x.b;
}
};
Entonces podr�an hacerse cosas como las siguientes:
X x1;
// tratar x1
X x2(x1); // x2 es un clon de x1
X x3 = x2; // x3 es un clon de x2
Adem�s, un constructor de copia es usado implicitamente al tartar con
objetos temporales:
bool f(X x)
{
..
}
..
X x1;
f(x1); // se realiza una copia temporal de x1 (en la pila) a trav�s del
// constructor de copia usado implicitamente
- Paso de par�metros por valor o por referencia
En C++ el paso de par�metros a una funci�n por referencia puede hacerse
con el operador &. Sem�nticamente, un par�metro por referencia dentro
del �mbito de una funci�n es una especie de "alias" del par�metro enviado.
Internamente, es equivalente a mandar un puntero:
void f(X& x)
{
x.a = 1;
}
..
X x1;
f(x1); // x1.a = 1
Tambi�n es posible usar un par�metro por valor para un objeto:
void f(X x)
{
..
}
Sin embargo, un par�metro por valor implica la realizaci�n de una copia
del objeto en un nuevo objeto temporal y la posterior destrucci�n de
�ste. Es decir, el coste es mayor. Adem�s, hay que preocuparse de tener
un constructor de copia si es que es necesario.
Un saludo.
--
_ |\
/ \ __ /\_ / \ _
_/ \ / \/ \__/ V \_
/ V \_
Luis Paul Tomillo luispaul@bbvnet.com
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads