Сокращение дублирования кода между оператором = и конструктором копии

Помните, что descending для собственный d. Так, я использовал бы стрелку вниз для убывания. Но, я всегда запутываюсь этим так или иначе. Я рекомендую использовать буквы вместо этого, как A-Z и Z-A вместо стрелок. Или, используйте их в сочетании со стрелками.

16
задан Dan Hook 25 September 2009 в 12:57
поделиться

4 ответа

Не существует «общего способа» для написания настраиваемых конструкторов копирования и операторов присваивания, который работал бы во всех случаях. Но есть идиома, называемая «копирование и обмен»:

 class myclass
 {
    ...
 public:
    myclass(myclass const&);

    void swap(myclass & with);

    myclass& operator=(myclass copy) {
        this->swap(copy);
        return *this;
    }

    ...
};

Это полезно во многих (но не во всех) ситуациях. Иногда можно добиться большего. Вектор или строка могут иметь лучшее назначение, которое повторно использует выделенную память, если она достаточно велика.

17
ответ дан 30 November 2019 в 16:14
поделиться

Разложите общий код на частную функцию-член. Простой (довольно надуманный) пример:

#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;
}
16
ответ дан 30 November 2019 в 16:14
поделиться
My &My::operator = (My temp)  // thanks, sellibitze
{
    swap (*this, temp);
    return *this;
}

и реализовать специализированный std :: swap <> (My &, My &) .

6
ответ дан 30 November 2019 в 16:14
поделиться

Как уже отмечалось на многих плакатах, имея оператор = создать новый объект с конструктором копирования, а затем использовать swap - это общий метод, используемый для того, чтобы не дублировать код в operator =.

Тем не менее, я хочу указать на некоторые плюсы и минусы этой техники, чтобы помочь вам решить, стоит ли она

Pro - безопасность исключений

Если у вашего объекта есть требования к ресурсам, которые могут вызвать выброс, и предполагается, что подкачка не будет выполняться, этот метод обеспечивает надежную гарантию безопасности исключений (либо объект, которому назначается, принял значение другого объекта или оно не изменяется).

Con - отпечаток ресурсов

Проблема с этим методом заключается в том, что он требует создания полностью нового объекта до того, как старый будет освобожден. Если вашему объекту требуется много ресурсов, это может быть проблемой.

3
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: