I ' m изучаю 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
?