Что должно делать задание копирования - PullRequest
0 голосов
/ 17 апреля 2020

Я ищу ответ на следующее объяснение ( из книги "Тур по С ++" )

MyClass& operator=(const MyClass&) // copy asignment: clean up target and copy

Я никогда не убрал цель (или, по крайней мере, я не понимаю, что это значит) при копировании так:

  • Идея копирование не означает наличие двух одинаковых вещей?
  • Если я уберу цель, разве это не будет move?
  • Что именно имеется в виду очистить цель?

    • ссылка также const, поэтому я не смогу ее изменить

Ниже в книге говорится:

MyClass& operator=(MyClass&&) // move assignment: clean up target and move

Здесь имеет смысл очистить цель, как я понимаю move - все работает

1 Ответ

2 голосов
/ 17 апреля 2020

Предположим, MyClass имеет собственный указатель

class MyClass {
  Owned *that;
public:
...
  MyClass& operator=(const MyClass&other) // copy asignment: clean up target and copy
  {
     Owned = other->owned;
  }

Что происходит с памятью, на которую указывает? это утечка. Так что вместо этого сделайте

  MyClass& operator=(const MyClass&other) // copy asignment: clean up target and copy
  {
     if (this == &other)  // prevent self assignment as this would in this case be a waste of time.
       return *this;
     delete that; // clean up
     that = new Owned(*other->that); // copy
     return *this; // return the object, so operations can be chained.
  }

Лучше благодаря @ PaulMcKenz ie && @ Eljay

  MyClass& operator=(const MyClass&other) // copy asignment: clean up target and copy
  {
     Owned *delayDelete = that;
     that = new Owned(*other->that); // copy, if this throws nothing happened
     delete delayDelete; // clean up
     return *this; // return the object, so operations can be chained.
  }
...