#include <iostream>
#include <cstdlib>

using namespace std;

class Din {
     private:
        int* ptr;
        int size;

     public:
        Din(int n= 5);
        Din(const Din& x);
        ~Din(void);
        void Ptr() const;
        Din& operator = (const Din& d);
};

Din::Din(int n)
{
    size= n;
    ptr= new int[n];
    for (int k=0; k<size; k++)
      ptr[k]= k;
}

Din::~Din(void)
{
    cerr << "Eliminando un Din de tamaño " << size << endl;
    delete [] ptr;
}

Din& Din::operator = (const Din& d)
{
   delete [] ptr;     // liberamos la memoria del objeto
   size= d.size;      // copiamos el tamano
   ptr= new int [size];  // reservamos nueva memoria
   for (int k=0; k<size; k++)  // copiamos la informacion
      ptr[k]= d.ptr[k];
   return *this;
}

Din::Din(const Din& d)
{
   delete [] ptr;     // liberamos la memoria del objeto
   size= d.size;      // copiamos el tamano
   ptr= new int [size];  // reservamos nueva memoria
   for (int k=0; k<size; k++)  // copiamos la informacion
      ptr[k]= d.ptr[k];
}

void Din::Ptr() const
{
    for (int k=0; k<size; k++)
      cout << ptr[k] << ' ';
}

void DP(const Din& x)
{
   x.Ptr();
   x.Ptr();
}

void foo()
{
   cerr << "entrando a foo\n";
   cerr << "imprimiendo a d\n";
   Din d(10);
   d.Ptr();
   cout << endl;

   Din b;
   cerr << "imprimiendo a b\n";
   b.Ptr();
   cerr << "copiando el varlor de d\n";
   b= d;
   cerr << "imprimiendo a b dos veces\n";
   DP(b);
   cerr << "saliendo de foo\n";
   return;
}

int main(int nargs, char* args[])
{
   cerr << "invocando a foo\n";
   foo();
   cerr << "regresando  de foo\n";
   return EXIT_SUCCESS;
}







