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