9

私は次のクラスを持っています:

class A
{
public:
   B& getB() {return b;}    
private:   
    B b;
};

class B
{
   ~B() {cout<<"destructor B is called";}
...

};

void func()
{
   A *a = new a;
   B b = a->getB();
   .....
}

関数 func を終了するときにクラス B のデストラクタが呼び出されるのはなぜですか? 関数 getB はオブジェクト B への参照を返しますか? クラス A がまだ関数 func の最後に存在する場合、なぜ B のデストラクタが呼び出されるのですか?

4

2 に答える 2

21
 B b = a->getB();

コピーコンストラクターを呼び出すB(const& B)ため、参照によって返されたオブジェクトのコピーであるスタック上に新しいオブジェクトを作成しています。代わりに使用してください:

 B& b = a->getB();

新しい B オブジェクトを作成しないため、デストラクタは呼び出されません

于 2012-05-29T15:00:48.477 に答える
7

あなたが持っているとき:

B b = a->getB();

( )Bの既存のインスタンスへの参照から、type の新しいオブジェクトが作成されます。ここで呼び出されるのは ではなく、コピー コンストラクターです。BB&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                    
于 2012-05-29T15:30:48.373 に答える