Безопасное присваивание и идиома копирования и обмена

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;}
};

Теперь у меня ряд вопросов:

  1. Безопасны ли методы и конструкторы, реализованные выше для класса Bar ? Используя копирование и замену для Foo , убедитесь, что я не могу причинить вреда при назначении или копировании Bar ?

  2. Передача аргумента по ссылке в конструкторе копирования и в свопе является обязательной?

  3. Можно ли сказать, что, когда аргумент operator = передается по значению, конструктор копирования вызывается для этот аргумент для создания временной копии объекта, и что эта копия затем заменяется на * this ? Если бы я перешел по ссылке в operator = , у меня была бы большая проблема, право?

  4. Существуют ли ситуации, в которых эта идиома не обеспечивает полную безопасность при копировании и назначении Foo ?

9
задан Rafael S. Calsaverini 6 May 2011 в 00:33
поделиться