あなたが持っているとき:
B b = a->getB();
( )B
の既存のインスタンスへの参照から、type の新しいオブジェクトが作成されます。ここで呼び出されるのは ではなく、コピー コンストラクターです。B
B&
B::operator=
各クラスにはコピー コンストラクターがあります (明示的に追加しない場合、コンパイラーが提供します)。同じクラスへの参照である単一の引数を受け入れます。上記のコードにはコピー コンストラクターを入れていないので、コンパイラーがコピー コンストラクターを生成したと仮定します。
class B
{
public:
B(B& other)
{
// memberwise copy (shallow copy)
};
};
したがってA::getB()
、 member への参照が返されA::b
、この参照が引数として に渡されました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