Дополнение к Никос С. * ответ :
Обмен не единственное решение, но довольно элегантное: вы сохраняете память оцелевая строка для повторного использования в исходной строке.Пока что все в порядке, вы можете начать с пустой строки после перемещения.Опять же, вы не должны удалять память, она прекрасно подходит для повторного использования.Таким образом, вы просто установите длину на 0.
Однако тогда вам нужно будет отдельно запомнить, сколько символов еще умещается в памяти.Но это все равно полезно.Подумайте, хотите ли вы перераспределять память строки каждый раз, когда добавляете один символ?
Скорее всего, нет.Таким образом, вы бы добавили немного дополнительной памяти (например, удвоение емкости, если у вас заканчивается память).Все вместе взятые:
class MyString
{
size_t length;
size_t capacity;
char* data;
public:
MyString& operator=(MyString&& other)
{
if(&other != this)
{
std::swap(data, other.data); // as in Nikos' answer
std::swap(capacity, other.capacity);
length = other.length;
other.length = 0; // restart with empty string
// still you have quite a bit of
// memory already reserved
}
return *this;
}
};
Имейте в виду, что это необязательно , хотя на самом деле вы, возможно, заставляете людей платить за то, что им может не понадобиться - если они не используют повторнопереехал с объекта ...