07 Introduccion a la POO

Anuncio
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
Descargar