У меня есть класс, для которого требуется конструктор и оператор присваивания не по умолчанию (он содержит списки указателей). Есть ли общий способ уменьшить дублирование кода между конструктором копирования и оператором присваивания?
Уменьшение дублирования кода между оператором = и конструктором копирования
Ответ 1
Нет никакого "общего пути" для написания конструкторов пользовательских копий и операторов присваивания, которые работают во всех случаях. Но там есть идиома под названием "copy-& -swap":
 class myclass
 {
    ...
 public:
    myclass(myclass const&);
    void swap(myclass & with);
    myclass& operator=(myclass copy) {
        this->swap(copy);
        return *this;
    }
    ...
};
Он полезен во многих (но не во всех) ситуациях. Иногда вы можете делать лучше. Вектор или строка могут иметь лучшее назначение, которое повторно использует выделенное хранилище, если оно достаточно велико.
Ответ 2
Извлеките общий код для частной функции-члена. Простой (довольно надуманный) пример:
#include <iostream>
class Test
{
public:
  Test(const char* n)
  {
    name = new char[20];
    strcpy(name, n);
  }
  ~Test()
  {
    delete[] name;
  }
  // Copy constructor
  Test(const Test& t)
  {
    std::cout << "In copy constructor.\n";
    MakeDeepCopy(t);
  }
  // Assignment operator
  const Test& operator=(const Test& t)
  {
    std::cout << "In assignment operator.\n";
    MakeDeepCopy(t);
  }
  const char* get_name() const { return name; }
private:
  // Common function where the actual copying happens.
  void MakeDeepCopy(const Test& t)
  {        
    strcpy(name, t.name);
  }
private:
  char* name;
};
int
main()
{
  Test t("vijay");
  Test t2(t); // Calls copy constructor.
  Test t3(""); 
  t3 = t2; // Calls the assignment operator.
  std::cout << t.get_name() << ", " << t2.get_name() << ", " << t3.get_name() << '\n';
  return 0;
}
Ответ 3
My &My::operator = (My temp)  // thanks, sellibitze
{
    swap (*this, temp);
    return *this;
}
и реализовать специализированный std::swap<> (My &, My &).
Ответ 4
Как уже было отмечено несколькими плакатами, оператор = создать новый объект с конструктором копирования, а затем использовать swap - это обычная техника, используемая, чтобы не копировать код в operator =.
Тем не менее, я хочу указать на некоторых профессионалов и разработчиков этой техники, которые помогут вам решить, подходит ли это.
Pro - безопасность исключений
Если ваш объект имеет требования к ресурсам, которые могут вызвать бросок и предполагая, что swap не будет выбрасываться, этот метод обеспечивает надежную гарантию безопасности исключений (либо объект, которому присвоено значение, принял значение другого объекта, либо без изменений).
Кон - ресурс
Проблема с этим методом заключается в том, что для создания старого нового объекта требуется создать новый новый объект. Если для вашего объекта требуется много ресурсов, это может быть проблемой.
