これは異なるはずだと確信していたので、混乱しました。このコード例を見てみましょう:新しく割り当てられる前にオブジェクトが削除されていない
#include <iostream>
#include <string>
using namespace std;
class base
{
public:
virtual ~base() = default;
};
class derived : public base
{
private:
int a = 0;
int *b = nullptr;
std::string lol;
public:
derived(std::string s) : b(new int(6)), lol{s} { cout << "ctor " << lol << endl; }
derived(derived const& d) : lol{d.lol + " copy"} {cout << "copy " << lol << endl; }
virtual ~derived() { cout << "dtor " << lol << endl; delete b; }
virtual void superFunction() { cout << "OMG " << lol << endl; }
};
int main()
{
derived a("a");
derived b("b");
a = b;
}
そして、すべての最適化をオフにした状態でプログラムの出力は次のようになります。
ctor a
ctor b
dtor b
dtor b
私はこのケースでは、コンパイラはオブジェクトa
を削除し、コピーを使用するコードを生成する必要があることを確信していました新しいオブジェクトを作成するコンストラクタです。代わりに暗黙的に宣言するoperator=
を使用します。
誰かが理由を説明できますか?または、私にC++標準を指摘してください。
ありがとうございました。
"コンパイラ"が最初に 'a'を削除した場合、' b'に何をコピーしますか?とにかく、ここにコピーはなく、割り当てだけです。 – juanchopanza
関連:https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three – vu1p3n0x