私は c++ を学んでおり、最近 (ここではスタック オーバーフローで) コピー アンド スワップ イディオムについて学びましたが、それについていくつか質問があります。たとえば、コピー アンド スワップ イディオムを使用する次のクラスがあるとします。
class Foo {
private:
int * foo;
int size;
public:
Foo(size_t size) : size(size) { foo = new int[size](); }
~Foo(){delete foo;}
Foo(Foo const& other){
size = other.size;
foo = new int[size];
copy(other.foo, other.foo + size, foo);
}
void swap(Foo& other) {
std::swap(foo, other.foo);
std::swap(size, other.size);
}
Foo& operator=(Foo g) {
g.swap(*this);
return *this;
}
int& operator[] (const int idx) {return foo[idx];}
};
私の質問は、データとして Foo オブジェクトを持つが、カスタムのコピーや割り当てが必要なポインターやその他のリソースを持たない別のクラスがあるとします。
class Bar {
private:
Foo bar;
public:
Bar(Foo foo) : bar(foo) {};
~Bar(){};
Bar(Bar const& other) : bar(other.bar) {};
Bar& operator=(Bar other) {bar = other.bar;}
};
今、私は一連の質問があります:
クラスに対して上記で実装されたメソッドとコンストラクターは
Bar安全ですか? コピーアンドスワップを使用してFoo、割り当てまたはコピー時に害がないようにしBarますか?コピーコンストラクターとスワップで引数を参照渡しすることは必須ですか?
の引数が
operator=値渡しされると、この引数に対してコピー コンストラクターが呼び出されて、オブジェクトの一時的なコピーが生成され、次に と交換されるのはこのコピーであると言うのは正しい*thisでしょうか? 参照で渡した場合operator=、大きな問題が発生しますよね?このイディオムがコピーと代入で完全な安全性を提供できない状況はあり
Fooますか?