Ver la versión completa : c++ <- paso de parámetros
Quiero pasar una función por valor, referencia y por direccionamiento.
Valor (clase cl)
Referencia (clase &cl)
pero no sabemos como cuyons se hace por direccionamiento. Resolución rápida plis.
DarkDijkstra
03/06/2008, 17:52
no se si te entiendo bien del todo... pero lo que quieres es pasar un puntero, no?
Direccionamiento (clase* cl)
D'accord. ¿Y para llamar a la función? ¿y el funcionamiento dentro de la función de esa clase?
DarkDijkstra
03/06/2008, 18:29
Puesss, vamos a ver, pongamos que tenemos dos clases, A y B
Class A
{
public:
int value;
};
Class B
{
public:
void function1(A a);
void function2(A& a);
void function3(A* a);
};
y luego, dentro de la especificación de la clase B:
void B::function1(A a)
{
a.value++;
}
void B::function2(A& a)
{
a.value++;
}
void B::function3(A* a)
{
a->value++;
// o lo que es lo mismo
// (*a).value++;
}
y luego ya en tu "main" o donde fuese, podrías tener...
A a;
B b;
a.value = 42;
b.function1(a);
cout << a.value << endl;
b.function2(a);
cout << a.value << endl;
b.function3(&a);
cout << a.value << endl;
(la salida del programa sería "42,43,44" si no me he patinado)
dentro de la clase B tienes tres métodos que aceptan distintos parámetros...
- el primero acepta un objeto de la clase A
- el segundo acepta una referencia a un objeto de la clase A
- el tercero acepta un puntero a un objeto de la clase A
todos los métodos aparentemente hacen lo mismo, incrementar el atributo "value" del parámetro
el resultado es "42,43,44" en vez de "43,44,45"... por que?
la movida es que en function1, el hecho de incrementar el valor NO es permanente, ya que realmente lo que le estas pasando por parámetro es una copia del objeto "a" (con la consiguiente necesidad de memoria y tiempo de crear la copia), en function2 estás pasando una referencia al objeto "a", es decir, una especie de "manejador" que te permite modificarlo y tal y no requiere hacer una copia, en function3 le estás pasando un puntero al objeto y se consigue más o menos lo mismo que con function2
en C no existen las referencias pero si los punteros, en C++ metieron las referencias para que fuesen una especie de "punteros" más sencillos de usar
no se si realmente te he liado más o si ya sabías todo esto... : S
Muchas gracias, muy bien explicadito, claro y limpio ^^
DarkDijkstra
03/06/2008, 18:38
No es sarcástico?
No me creo que una de mis explicaciones sea clara y limpia XD
Yo se lo que es valor, referencia y me faltaba direccionamiento, que el caso es que lo he usado pero no lo he llamado asi. Casi me cargan una práctica por usar los . en vez de ->
Y si, está muy claro porque se lo he pasado a un compañero que era al que más falta le hacía y lo ha entendido a la primera ;)
< - >
Por cierto, hay ambigüedad entre valor y referencia por lo que veo. Edita el código y pon a cada función su nombre que estoy usando tu post de ejemplo para la clase ^^
Un consejo, usar referencias es programar mas al estilo C++ que usando punteros. Y que no se te olvide poner 'const' en caso de que no se modifique, queda mas claro el codigo.
¡¡¡Asi que para eso era los const!!! ¡Toda la tarde comiéndome el coco! ¡¡Gracias!!!
< - >
Decía yo para que coño meterlo por referencia si quiero valor...no es mas fácil poner valor directamente. Y cuando se declara al final de la función para no alterar los atributos ya me partía el ojal...
Es lo que tiene estudiar una asignatura sin tener apuntes, que tiras de donde no hay xDDD Como aprobé las prácticas con lo que sabía de java me pensé que todo el monte era orégano.
Pakoito, si pasas un entero por valor por ejemplo y lo cambias dentro de la función, por fuera en la función que lo llama no se entera, ya que se hace una copia local. Por eso se pasa por "direccionamiento" con un puntero los parámetros que quieres cambiar. Esto es en C.
Luego en C++ dijeron es un rollo lo de los punteros con la flecha, y se inventaron los parámetros por referencia, que es el estilo de Pascal. Lo que pasa es que con esto no sabes si cambiará o no el parámetro, por eso se usa const para aclararlo.
Pakoito, si pasas un entero por valor por ejemplo y lo cambias dentro de la función, por fuera en la función que lo llama no se entera, ya que se hace una copia local. Por eso se pasa por "direccionamiento" con un puntero los parámetros que quieres cambiar. Esto es en C.
Gracias hombre, pero eso ya lo tenía claro en primero de carrera, me fallaba el cambio a c++ xDDD
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.