• Ir al contenido
  • Ir a la navegación
  • Ir al buscador
 
Boludo
ING English
Directorio WAP para móvil, Tablet, iPhone o Smartphone

Centro de Noticias de la Universidad de Oriente

Categorías

 

Inicio  |  Contacto  |  Posts  |  TIENDA PUBLISHOP  |  Sobre nosotros  |  Registro y Planes  |  Pagos  |  Donaciones

Ver Código QR de esta página

Campaña #AyudemosaYuli  |  Campaña #AyudemosaStephany  |  Campaña #AyudemosaBeli  |  Campaña #AyudemosaNeulys.
 

Parámetros por valor y por referencia de objetos

 

lunes julio 11, 2016

Los parámetros de un método pueden ser de tipo objeto y también los podemos hacer por valor o referencia.

Cuando un parámetro de tipo objeto se hace por valor se hace una copia idéntica de dicho objeto en otra parte de memoria.

Si modificáramos los atributos de dicho parámetro no se estarían modificando los atributos del objeto que le pasamos en la llamada.

Veamos un programa que recibe un objeto como parámetro por valor y cambiemos sus atributos y veamos que sucede con el objeto original.

Programa:

#include<iostream>

using namespace std;

class Reloj {
    int hora;
    int minuto;
    int segundo;
public:
    Reloj(int hora, int minuto, int segundo) { this->hora = hora; this->minuto = minuto; this->segundo = segundo; };
    void imprimir();
    void intentoCambiar(Reloj r);
};

void Reloj::imprimir()
{
    cout << hora << ":" << minuto << ":" << segundo << "";
}

void Reloj::intentoCambiar(Reloj r)
{
    r.hora = 1;
    r.minuto = 0;
    r.segundo = 0;
}

void main()
{
    Reloj reloj1(10, 10, 10);
    Reloj reloj2(20, 20, 20);
    reloj1.intentoCambiar(reloj2);
    reloj1.imprimir();  // imprime: 10:10:10
    reloj2.imprimir();  // imprime: 20:20:20
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :

ObjetoParametroValor1.zip

En la main creamos dos objetos de la clase Reloj e inicializamos la hora, minuto y segundo actual de cada reloj.

El método intentoCambiar recibe un parámetro por valor de la clase Reloj:

class Reloj {
    int hora;
    int minuto;
    int segundo;
public:
    Reloj(int hora, int minuto, int segundo) { this->hora = hora; this->minuto = minuto; this->segundo = segundo; };
    void imprimir();
    void intentoCambiar(Reloj r);
};

En el algoritmo del método intentoCambiar modificamos los atributos del parámetro r:

void Reloj::intentoCambiar(Reloj r)
{
    r.hora = 1;
    r.minuto = 0;
    r.segundo = 0;
}

Pero como podemos comprobar cuando desde la main le enviamos el objeto reloj2 al método intentoCambiar los atributos originales de dicho objeto no se alteran (siguen teniendo los valores que le pasamos al constructor):

void main()
{
    Reloj reloj1(10, 10, 10);
    Reloj reloj2(20, 20, 20);
    reloj1.intentoCambiar(reloj2);
    reloj1.imprimir();  // imprime: 10:10:10
    reloj2.imprimir();  // imprime: 20:20:20
    cin.get();
}

Esto funciona así ya que dentro del método intentoCambiar se crea un parámetro r de la clase Reloj con una copia idéntica del objeto que le pasamos desde la main. Es importante hacer notar que si la clase Reloj tiene destructor el mismo se ejecutará cuando se libere el espacio del parámetro r al finalizar el método intentoCambiar.

Modifiquemos este mismo problema y definamos el parámetro por referencia:

Programa:

#include<iostream>

using namespace std;

class Reloj {
    int hora;
    int minuto;
    int segundo;
public:
    Reloj(int hora, int minuto, int segundo) { this->hora = hora; this->minuto = minuto; this->segundo = segundo; };
    void imprimir();
    void intentoCambiar(Reloj &r);
};

void Reloj::imprimir()
{
    cout << hora << ":" << minuto << ":" << segundo << "";
}

void Reloj::intentoCambiar(Reloj &r)
{
    r.hora = 1;
    r.minuto = 0;
    r.segundo = 0;
}

void main()
{
    Reloj reloj1(10, 10, 10);
    Reloj reloj2(20, 20, 20);
    reloj1.intentoCambiar(reloj2);
    reloj1.imprimir();  // imprime: 10:10:10
    reloj2.imprimir();  // imprime: 1:0:0
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :

ObjetoParametroReferencia1.zip

El único cambio que hemos dispuesto es que el parámetro r pasa por referencia (es decir ahora r es un alias de la variable que le pasamos desde la main):

void Reloj::intentoCambiar(Reloj &r)
{
    r.hora = 1;
    r.minuto = 0;
    r.segundo = 0;
}

Si modificamos los atributos de r, estamos modificando los atributos del objeto reloj2 que le pasamos desde la main y es por eso que cuando imprimimos luego los atributos del objeto reloj2 vemos que los datos son distintos a los que le pasamos en el constructor:

void main()
{
    Reloj reloj1(10, 10, 10);
    Reloj reloj2(20, 20, 20);
    reloj1.intentoCambiar(reloj2);
    reloj1.imprimir();  // imprime: 10:10:10
    reloj2.imprimir();  // imprime: 1:0:0
    cin.get();
}

Otra cosa importante que hay que destacar que cuando pasamos un parámetro por referencia el destructor de dicho parámetro no se ejecuta.

Cuando se pasan objetos grandes el tiempo de hacer la copia en el parámetro puede ser costoso para la eficiencia de nuestro programa. Es muy común en estos casos pasar por referencia aunque no tengamos que modificar el objeto que le pasamos, le agregamos el modificador const al parámetro por referencia para evitar modificarlo.

  1. Plantear la clase Reloj y definir como atributo la hora, minuto y segundo. En el constructor inicializar los atributos. Definir un método que retorne si son iguales los atributos de dos objetos de tipo Reloj, el método tiene que tener la estructura:

      bool iguales(Reloj r);
    
  2. Volver a codificar el problema anterior pero ahora al método iguales hacer que llegue como referencia el parámetro (agregamos el modificador const ya que no tenemos que modificar el objeto que le pasamos como referencia):

      bool iguales(const Reloj &r);
    
Solución
#include<iostream>

using namespace std;

class Reloj {
    int hora;
    int minuto;
    int segundo;
public:
    Reloj(int hora, int minuto, int segundo) { this->hora = hora; this->minuto = minuto; this->segundo = segundo; };
    void imprimir();
    bool iguales(Reloj r);
};

void Reloj::imprimir()
{
    cout << hora << ":" << minuto << ":" << segundo << "";
}

bool Reloj::iguales(Reloj r)
{
    if (hora == r.hora && minuto == r.minuto && segundo == r.segundo)
        return true;
    else
        return false;
}

void main()
{
    Reloj reloj1(10, 10, 10);
    Reloj reloj2(10, 10, 10);
    reloj1.imprimir();  
    reloj2.imprimir();  
    if (reloj1.iguales(reloj2))
        cout << "Tienen la misma hora los relojes";
    else
        cout << "No tienen la misma hora los relojes";
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :ObjetoParametroValor2.zip

#include<iostream> using namespace std; class Reloj { int hora; int minuto; int segundo; public: Reloj(int hora, int minuto, int segundo) { this->hora = hora; this->minuto = minuto; this->segundo = segundo; }; void imprimir(); bool iguales(const Reloj &r); }; void Reloj::imprimir() { cout << hora << ":" << minuto << ":" << segundo << ""; } bool Reloj::iguales(const Reloj &r) { if (hora == r.hora && minuto == r.minuto && segundo == r.segundo) return true; else return false; } void main() { Reloj reloj1(10, 10, 10); Reloj reloj2(10, 10, 10); reloj1.imprimir(); reloj2.imprimir(); if (reloj1.iguales(reloj2)) cout << "Tienen la misma hora los relojes"; else cout << "No tienen la misma hora los relojes"; cin.get(); }

Este proyecto lo puede descargar en un zip desde este enlace :ObjetoParametroReferencia2.zip

— @SergioAlemanGT

— Síguenos en Twitter@SergioAlemanGT

Categorías: #C++, #

Comentarios

Ayuda
 

COMPÁRTELO:


Me Gusta :)Facebook Tuiteame :)Twitter .WhatsApp .Telegram . LinkedIn

También te puede interesar:

NOCIONES BÁSICAS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS.
Material de Apoyo del Curso de Programación - Lenguaje C++ - Periodo (Feb - May) del año en curso
Parámetros por valor y por referencia de datos simples
Métodos constantes (const)
Parámetros de un método constante (const)
Definición de constantes (const)
Directiva #define
Puntero this
Métodos estáticos de una clase
Atributos estáticos de una clase


« Parámetros por valor y por referencia de datos simples  |  ¿ACASO MURIO JESUS EL VIERNES? »
 
Apps Infoudo
 
Buscador:
Powered by Google:


Web móvil
Imágenes
La Web

 

Síguenos por RSS


Puedes leerlos mediante el navegador Firefox, lectores de noticias en la computadora o el móvil o usando el servicio de Feedburner de Google para recibir las notificaciones por correo electrónico.
RSS - Suscribirse usando Feedburner de Google

email Recibir las nuevas publicaciones de Infoudo por email

Atom


»Ir a URL
.....
Registra Gratis Tu Negocio
....
Sugerir un nuevo sitio WAP

...
¡Bloguea Ya!

..
Registro de Profesionales(Abogados, escritores, doctores, licenciados, ingenieros, etc.)
.
Soporte

Síguenos en las redes sociales

Síguenos en Facebook facebook.com/INFOUDO.OFICIAL Síguenos en Twitter @infoudomonagas Síguenos en Instagram @infoudomonagas
Síguenos en Facebook facebook.com/boludooficial Síguenos en Twitter @bolUDOoficial Síguenos en Instagram @boludooficial Síguenos en Telegram t.me/Boludooficial
Síguenos en Facebook facebook.com/InfoudomonagasOficial Síguenos en Twitter @SergioAlemanGT Síguenos en Instagram @alemansistem
Síguenos en Instagram @sergioalemanoficial Síguenos en Telegram t.me/SergioAlemanOficial Mi perfil en GitHub @sergioaleman
Síguenos en YouTube www.youtube.com/channel/UCqcLSYCKx9pamla68nFMDkw

Móvil: (0426 683 6955) - E-mail: [email protected] - [email protected] - WhatsApp: +58 (0426) 683.69.55


Copyscape
Volver arriba

Protocolo  |  Mapa del Sitio  |  Report Abuse - DMCA  |  Términos y Condiciones  |  Ayuda  |  Privacidad de Datos  |  Política de Cookies  |  Reportar un bug  |  Licencia: CC BY-NC-ND 3.0

Copyright ©2022 Boludo. Todos los derechos reservados. Diseñado y Desarrollado por Sergio Alemán Mi perfil en GitHub


SUBIR