したがって、次の例では、クラスFoo
を*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;
}
どのような事故ですか?代入はそれだけです - 新しい値を古い値に代入します。 –
デフォルトの代入演算子はmemcpyを使用しません(ただし、コンパイラの最適化によってその結果になる可能性があります)。メンバーワイズ割り当てです。 – huskerchad
'int i、j; i = 5; j = i; '私はもはや私が使用できないことを期待するのは賢明だと言っていますか?同意しません。 – Fiktik