Programación Orientada a Objetos Parámetros Recuerde…. La sintaxis que se usa para definir un método es la siguiente: <TipoDevuelto> <identificador> ([<Parámetros>]) { <instrucciones> } Parámetros Un parámetro es un tipo de variable que es recibida por un método. Un parámetro influye en el comportamiento o el resultado de la ejecución del método que lo recibe. Tipos: Parámetros de Entrada: contienen datos que son pasados al método desde el código llamador. Parámetros de Salida: contienen datos que son calculados dentro del método y retornados al código llamador. Parámetros de Entrada/Salida: reciben datos desde el código llamador, se modifican los datos, y se retornan al código llamador. Paso de parámetros Por valor Se utilizan como parámetros de entrada Por referencia Se utiliza como parámetros de salida o de entrada/salida Parámetros por valor Se usan para proporcionar información de entrada a un método Hasta ahora en todos los métodos estudiados, los parámetros pasados a los métodos han sido pasados por valor Pasar por «valor» indica que a los métodos se han pasado copias de los valores pero nunca las variables Quiere decir que el cambio de un valor de un parámetro no actualiza el valor de la variable que se pasó al método Cuando invocamos un método pasando una variable como parámetro por valor, a pesar de que cambiemos el valor del parámetro dentro del método, la variable original no se ve afectada por ese cambio. Parámetros por referencia Se usan cuando un método debe modificar el valor de la variable pasada como parámetro Está basado en pasar al método una referencia a la variable actual en lugar de su valor La referencia que un método recibe es la dirección de la variable. Las referencias sirven para definir "alias" o nombres alternativos para una misma variable. Para ello se usa el operador de referencia (dirección) (&), el cual devuelve la dirección donde se ubica una variable en la memoria Una limitación es que se pueden pasar sólo variables al método. No se pueden utilizar constantes ni expresiones en la línea de llamada al método. Parámetros de entrada class Contenedor { private: int vector[50]; int tamano; int cantidad; Son variables locales al método que se inicializan con los valores que existen en la llamada Ejemplo: void eliminarElementoPos(int pos) { for (int i=pos; i<cantidad; i++) vector[i]=vector[i+1]; cantidad--; } En el main cout<<"que posicion desea eliminar? "; cin>>x; Numeros.eliminarElementoPos(x); El método usa el valor que entra en «pos» Parámetros de salida class EcuCuadratica {private: int a; int b; int c; El método fija los valores de los parámetros y los devuelve al main (o al punto donde fue invocado) void raices(float &R1, float &R2 ) { R1 = (-b + sqrt (b*b-4*a) / (2*a); R2 = (-b - sqrt (b*b-4*a) / (2*a); } En el main int main() { float x1,x2; EcuCuadratica ecuacionA(2,2,-12); ecuacionA.raices(x1,x2); cout<< "La solucion a la ecuacion es"<<x1<<" "<<x2; return 0;} El método calcula R1 y R2 y estos valores son luego accedidos desde el main Parámetros de entrada y salida void intercambio(int &valor2) { int aux; aux= valor2; valor2=valor; valor=aux; } class Numero { private: int valor; ….. El método recibe valor2 y lo modifica En el main int main() { int a; Numero num(5) ; a = 10; cout << "a,num ->" << a << ", " << num.getValor() << endl; num.intercambio(a); cout << "a,num ->" << a << ", " << num.getValor() << endl; return 0;} Cuando se utilizan parámetros por valor y por referencia se deben tener presentes los siguientes aspectos: Resumiendo… Los parámetros por valor (declarados sin &) reciben copias de valores pasados a ellos. Las asignaciones a parámetros por valor en un método nunca cambian los valores originales pasados a los parámetros. Los parámetros referencia (declarados con &) reciben la dirección de los valores pasados a ellos. En un método, las asignaciones a parámetros por referencia cambian los valores de los parámetros originales class Contenedor { private: int vector[50]; int tamano; int cantidad; Paso de parámetros A B Suponga que en la clase Contenedor se desea un método sumaVectores() que recibe un segundo arreglo como parámetro y modifique el primer arreglo con la suma de los elementos de ambos arreglos 4 6 8 9 2 [0] [1] [2] [3] [4] 3 4 5 8 1 [0] [1] [2] [3] [4] A 7 10 13 17 3 [0] [1] [2] [3] [4] Ejemplo: Paso de parámetros void SumaVectores(Contenedor vec2){ class Contenedor { private: int vector[50]; int tamano; int cantidad; // es una forma de enviar una copia del arreglo completo for(int i=0;i<cantidad;i++) this->vector[i]= this->vector[i] + vec2.vector[i]; // note que la suma altera el arreglo vector } En el main int elem; Contenedor A(5); Contenedor B(5); cout<<"Escriba los valores del vector A"<<endl; for (int i=0; i<5;i++) { cin>>elem; A.InsertarElemento(elem);} cout<<"Escriba los valores del vector B"<<endl; for (int i=0; i<5;i++) { cin>>elem; B.InsertarElemento(elem);} A.SumaVector(B); cout<<"La suma de los elementos del vector A y el vector B: "<<endl; A.ImprimeVector(); B.ImprimeVector(); } class Contenedor { private: int vector[50]; int tamano; int cantidad; Ejemplo: Paso de parámetros void SumaVectores(Contenedor vec2) {for(int i=0;i<cantidad;i++) this->vector[i]= this->vector[i] + vec2.vector[i]; Note que vec2 es un } objeto de la clase Contenedor B En el main int elem; Contenedor A(5); Contenedor B(5); …… A.SumaVector(B); vector 6 7 8 9 10 [0] [1] [2] [3] [4] Cantidad=5 Tamano=5 Ejemplo: Paso de parámetros class Contenedor { private: int vector[50]; int tamano; int cantidad; class Contenedor { private: int vector[50]; int tamano; int cantidad; Ejemplo: Paso de parámetros A B En la clase Contenedor escriba un método que ahora intercambie los elementos de dos vectores. Para hacer esto debe recibir el vector a intercambiar, es decir debe recibir como parámetro una instancia de tipo Contenedor Ejemplo: 4 6 8 9 2 [0] [1] [2] [3] [4] 3 4 5 8 1 [0] [1] [2] [3] [4] A B 3 4 5 8 1 [0] [1] [2] [3] [4] 4 6 8 9 2 [0] [1] [2] [3] [4] Ejemplo: Paso de parámetros class Contenedor { private: int vector[50]; int tamano; int cantidad; void intercambio(Contenedor vec2) { int temp; for(int i=0; i<cantidad; i++) { temp= this->vector[i]; this->vector[i]= vec2.vector[i]; vec2.vector[i] = temp; } } En el main // suponiendo que ambos arreglos ya fueron creados y están llenos A.intercambio(B); cout<<"Imprimiendo A:"<<endl; A.ImprimeVector(); cout<<"Imprimiendo B:"<<endl; B.ImprimeVector(); Paso de parámetros En el ejemplo anterior el arreglo real NO se pasa al método sólo una copia de su valor. void intercambio(Contenedor vec2) {….} Su uso es local, al terminar el método la copia se pierde y el original no es alterado Ejemplo: Paso de parámetros class Contenedor { private: int vector[50]; int tamano; int cantidad; void intercambioRef(Contenedor &vec2) { int temp; for(int i=0; i<cantidad; i++) { temp= this->vector[i]; this->vector[i]= vec2.vector[i]; vec2.vector[i] = temp; } } En el main // suponiendo que ambos arreglos ya fueron creados y están llenos A.intercambioRef(B); // intercambia los valores de ambos arreglos cout<<"Imprimiendo A:"<<endl; A.ImprimeVector(); cout<<"Imprimiendo B:"<<endl; B.ImprimeVector(); Paso de arreglos como parámetros En el ejemplo anterior al método se le pasa la dirección del arreglo void intercambioRef(Contenedor &vec2) {….} Al terminar el método el arreglo original es alterado Práctica en clase: Suponga que en el main se han creado los objetos A y B de tipo Contenedor y que ambos ya tienen valores definidos: Escriba un método que reciba una instancia tipo Contenedor como entrada y devuelva true si ambos arreglos son iguales y false, en caso contrario. class Contenedor { private: int vector[50]; int tamano; int cantidad; A.sonIguales(B) Escriba un método que reciba una instancia tipo Contenedor como entrada y modifique cada uno de sus valores con el producto de los valores de A y B. A.multiplica(B) REFERENCIAS C. Lethbridge, Timothy. (2001). Object-Oriented Software Engineering, United Kingdom. Booch, Grandy. (1996 ). “ Análisis y Diseño Orientado a Objetos con Aplicaciones”., Editorial Addison Wesley Logman, 2 da edición, México,. Martín, James. (1994). Odell, James J;“Análisis y Diseño Orientado a Objetos”, Editorial Prentice Hall, 1era edición, México, Rodríguez Rojas, Oldemar. (1997) . “ C ++ para ambientes gráficos”., Editorial Tecnológica de Costa Rica, 1era edición, Costa Rica. Usado únicamente con fines académicos