[C con Clase] Problema con interpretación de código relaccionado con clases.

Oscar Aparicio Holgado pelucheloko en hotmail.com
Jue Ago 2 21:27:12 CEST 2012


En realidad sólo tenía duda con lo que preguntaba, lo que me comentas extra ya lo sabía, aún así gracias por tomarte tu tiempo.

Un saludo.

-----Original Message-----

From: Camilo José
Sent: 2 Aug 2012 15:13:54 GMT
To: cconclase en listas.conclase.net
Subject: Re: [C con Clase] Problema con interpretación de código relaccionado con clases.

Oscar, planteas como duda:

O> No entiendo que es (SimpleCat theCat); ni (SimpleCat *theCat); ¿Se entiende
O> ahora la duda?

ambas declaraciones tienen una gran diferencia entre si, veamoslas.

1. SimpleCat FunctionOne(SimpleCat theCat);
Estas declarando un método que toma toma como parámatro una variable e tipo SimpleCat. Cuando el método sea llamado se creara en memoria una copia exacta a la variable (en este caso un objeto) que pasaste, toda modificaion que hagas a esta variable será sobre ella y no sobre la que indicaste como parámetro al invocar la función
2. SimpleCat* FunctionTwo (SimpleCat *theCat);
Esta declaración es un caso especial de la anterior, pues estas declarando como parámetro una referencia a una dirección en memoria que contiene lo a estructura de datos que es como tal el objeto, digo estructura, pues en memoria no solo estarán los datos de los campos, sino que también se almacena información procedente al tipo de objeto(la clase) los métodos que tiene, su nivel de accesibilidad, etc. Con esta referencia puedes manipular toda la informacion del objeto, pero ojo, estos cambios se veran reflejados en el objeto original.
Al final te pongo una modificacion a tu código original para que puedas ver los que te explico.

hay muchas ventajas de esto usar referencias en los métodos, funciona con todos los tipos de datos y un uso especial que tiene es el ahorro de memoria. Mira este ejemplo de los estandares de C

strcpy (char*, const char*); //Puedes encontrar este método en el fichero string.h

El método copia en el primer parametro el texto del segundo. Es una finción de copia
El primer campo es una referencia al campo donde se coppiara el nuevo contenido, es obligatoria que sea una referencia.
El segundo es el texto a añadir, pero por que es tambien una referencia? pues lo es como un método de que no se duplique la información y ahorrar memoria, y la manera de evitar que sea modificado el contenido es indicando que su contenido no lo sea a través de const. Hay cuatro formas de indicar las referencias en los métodos que posibilitan toda una serie de modificaciones o no a la referencia que estas indicando. Puedes buscar toda este información en el Libro "Cómo Programar en C/C++" de Harvey M. Deitel, Pail Dietel, hay un capítulo específico dedicado a ello, que deberías estudiar después de que entiendas bien el uso de las referiancias

Ahora el ejemplo

//------------------------------------

#include <iostream>

class SimpleCat
{
private:
    int x;
public:
    SimpleCat();               // constructor
    SimpleCat(SimpleCat&);     // copy constructor
    ~SimpleCat();              // destructor
    int getX()
    {
        return x;
    };
    void setX(int _x)
    {
        x = _x;
    }
};

SimpleCat::SimpleCat()
{
    std::cout << "Simple Cat Constructor ...\n";
    //Inicializacion de campos
    x = 69;
}

SimpleCat::SimpleCat(SimpleCat&)
{
    std::cout << "Simple Cat Copy Constructor ...\n";
}

SimpleCat::~SimpleCat()
{
    std::cout << "Simple Cat Destructor ...\n";
}

SimpleCat FunctionOne(SimpleCat theCat);
SimpleCat* FunctionTwo (SimpleCat *theCat);

int main()
{
    std::cout << "Making a cat ...\n";
    SimpleCat Frisky;
    std::cout << "Calling FunctionOne ...\n";
    std::cout<<"Obteniendo X: "<<Frisky.getX()<<std::endl;
    FunctionOne(Frisky);
    std::cout<<"Obteniendo X: "<<Frisky.getX()<<std::endl;
    std::cout << "Calling FunctionTwo ...\n";
    FunctionTwo(&Frisky);
    std::cout<<"Obteniendo X: "<<Frisky.getX()<<std::endl;
    return 0;
}

// FunctionOne, passes by value
SimpleCat FunctionOne(SimpleCat theCat)
{
    std::cout << "Function One. Returning ...\n";
    theCat.setX(33);
    return theCat;
}

// functionTwo, passes by reference
SimpleCat* FunctionTwo (SimpleCat *theCat)
{
    std::cout << "Function Two. Returning ...\n";
    theCat->setX(44);
    return theCat;
}

//------------------------------------

Esta es la salida

Making a cat ...
Simple Cat Constructor ...
Calling FunctionOne ...
Obteniendo X: 69
Simple Cat Copy Constructor ...
Function One. Returning ...
Simple Cat Copy Constructor ...
Simple Cat Destructor ...
Simple Cat Destructor ...
Obteniendo X: 69
Calling FunctionTwo ...
Function Two. Returning ...
Obteniendo X: 44
Simple Cat Destructor ...

Process returned 0 (0x0)   execution time : 0.157 s
Press any key to continue.

Ante cualquier duda no temas preguntar
_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




Más información sobre la lista de distribución Cconclase