[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