[C con Clase] Duda sobre ejercicio

Miguel Alejandro Jimenez Ramirez cerberbero en gmail.com
Sab Nov 3 15:41:51 CET 2012


Hola a todos espero que esten bien , buneo el dia de hoy queria enviar
un ejercicio , por que tengo unas dudas; el programa es el siguiente:


#include <iostream>

class A
{
public:
    explicit A(int n = 0) : m_n(n) { }

    A(const A& a)
        : m_n(a.m_n)
    {
        ++m_copy_ctor_calls;
    }

public:
    static int m_copy_ctor_calls;

private:
    int m_n;
};

int A::m_copy_ctor_calls = 0;

A f(const A& a) { return a; }

A g(const A a) { return a; }

int main()
{
    A a;
    A b = a, c(a);
    std::cout << A::m_copy_ctor_calls;

    b = g(c);
    std::cout << A::m_copy_ctor_calls;

    const A& d = f(c);
    std::cout << A::m_copy_ctor_calls << std::endl;

    return 0;
}


Al ejecuterlo , sale 245


Buneo , mis preguntas son:


1. Entiendo el primer 2 , pero por uque se vuelve a entrar al
constructor copia al llamar a la funcion:

A g(const A a) { return a; }
////
cuando hago la asignacion:

b=g(c);

se vuelve a acceder al constructor copia dos veces mas ,, entonces me
pregunto yo , es que cuando la funcion g , recibe como parametros una
clase tipo A , en este caso c , se vuelve a crear el constructor
copia?

2.cuando hago la de claracion de la clase d ,

const A& d = f(c);

no entiendo por que se llama al constructor copia una vez , ya que la
funcion f devuelve una clase A , y los parametros que recibe es la
referencia de una clase A en este caso c , es decir no me queda claro
como se cuando llamo al constructor copia , en que casos

A f(const A& a) { return a; }

3. Otra pregunta respecto a este ejercicio , es la siguiente , el tipo
de almacenamiento explicit , no esta explicado en el curso entonces ,
me gustaria saber cuando se utiliza , y cual es su funcionalidad , si
me pueden ayudar conesto les agradeceria.



Bueno  esas son las preguntas de este ejercicio , pero tengo otras ,
respecto al apuntador this,


PREGUNTAS RESPECTO AL APUNTADOR THIS.


En el curso hay un capitulo donde hablan de constructores virtuales ,
utilizan una funcion para clonar una clase , en eseta aprte hacen una
llamada a una funcion para clonar la clase , la verdad no entiendo muy
bien , por que el programa es el siguiente:

#include <iostream>
#include <cstring>
using namespace std;

class Persona {
  public:
   Persona(const char *n) { strcpy(nombre, n); }
   Persona(const Persona &p);
   virtual void VerNombre() {
      cout << nombre << endl;
   }
   virtual Persona* Clonar() { return new Persona(*this); }
  protected:
   char nombre[30];
};

Persona::Persona(const Persona &p) {
   strcpy(nombre, p.nombre);
   cout << "Per: constructor copia." << endl;
}

class Empleado : public Persona {
  public:
   Empleado(const char *n) : Persona(n) {}
   Empleado(const Empleado &e);
   void VerNombre() {
      cout << "Emp: " << nombre << endl;
   }
   virtual Persona* Clonar() { return new Empleado(*this); }
};

Empleado::Empleado(const Empleado &e) : Persona(e) {
   cout << "Emp: constructor copia." << endl;
}

class Estudiante : public Persona {
  public:
   Estudiante(const char *n) : Persona(n) {}
   Estudiante(const Estudiante &e);
   void VerNombre() {
      cout << "Est: " << nombre << endl;
   }
   virtual Persona* Clonar() {
      return new Estudiante(*this);
   }
};



Cuando se declara la funcion :

   virtual Persona* Clonar() { return new Persona(*this); }

entonces , es virtuel y es un apuntador a Persona , lo que retorna es
un espacio de memoria para Persona ?, es decir en que momento cuando
se llama a esta funcion desde el main
por que yo entiendo que el constructor copia es como una funcion:

Clase(const Clase &objeto){ instrucciones }


y en esta funcion clonar retorna es :

Clase(Clase *ptr);

No lo entiendo , por favor me pueden ayudar conestas dudas , les
agradezco y siento si el correo es muy largo , espero tengan el tiempo
para contestarme , gracias.

Cordialmente.

-- 
MIGUEL ALEJANDRO JIMENEZ R.




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