15

したがって、次の例では、 classFooを に置き換えます*this = Foo()Fooこの状況では古いデストラクタが呼び出されないことが判明したため、これをテストしてよかったです。これは、デフォルトの代入演算子が単に使用するためだと思いますmemcpy...しかし、言語設計の問題として...事故を防ぐために、デフォルトの代入演算子が割り当て先オブジェクトを最初に破棄しないのはなぜですか?

http://codepad.org/9WCo6yZ5

#include <iostream>
using namespace std;

class MustBeDestroyed //(for some reason not shown here)
{
public:
  int i;
  MustBeDestroyed(int i) : i(i) {}
  ~MustBeDestroyed() { cout << "destroyed contained class " << i << endl; }
};

class Foo
{
public:
  MustBeDestroyed x;
  Foo(int y) : x(y) {}
  void replace_myself(int y) { Foo f(y); *this=f; }
  void print() { cout << "This is outer/inner class " << x.i << endl; }
  ~Foo() { cout << "destroyed outer class " << x.i << endl; }
};

int main()
{
  Foo a(1);
  a.print();
  a.replace_myself(2);
  a.print();
  return 0;
}
4

2 に答える 2

7

最初にオブジェクトを破棄すると寿命が終わるためです。次に、コンストラクターを呼び出して、新しいオブジェクトの有効期間を開始する必要があります。しかし、operator= の動作は、現在のオブジェクトを破棄して別のオブジェクトを作成することではなく、既存のオブジェクトに新しい値を割り当てることです。

基本的に、あなたは 3 のルールに違反しています。

于 2013-05-02T14:48:37.320 に答える