Cuando se tiene:
B b = a->getB();
se crea un nuevo objeto de tipo B
a partir de una referencia a la instancia existente de B
(B&
). No es el B::operator=
que se llama aquí pero copia constructor.
Cada clase tiene un constructor de copia (si no lo agrega explícitamente, el compilador proporcionará uno para usted). Acepta un único argumento que es una referencia a la misma clase. Usted no ha puesto constructor de copia en el código anterior, así que supongo que el compilador ha generado una para ti:
class B
{
public:
B(B& other)
{
// memberwise copy (shallow copy)
};
};
Así A::getB()
devuelve una referencia al miembro A::b
y esta referencia se pasa como argumento a B::B(B&)
.
void func()
{
A *a = new A(); // Instance of A is created on the heap;
// (pointer a is a local variable and is on the stack though!)
// A::b is object of type B and it is on the heap as well
B b = a->getB(); // Instance of class B is created on the stack (local variable)
.....
delete a; // deleting A from the heap:
// A::~A is called which calls B::~B (of its member b)
} // a and b go out of the scope; b is an object => B::~B is called
Su objeto b sigue siendo local para la función. –