Это плохо, потому что operator=
больше не может полагаться на объект настройки. Вы должны сделать это наоборот, и можете использовать идиому копирования-обмена.
В случае, когда вам просто нужно скопировать все элементы, вы можете использовать неявно сгенерированный оператор присваивания.
В других случаях вам придется дополнительно что-то делать, в основном освобождая и копируя память. Вот где идиома копирования-обмена хороша. Он не только элегантен, но и обеспечивает, чтобы назначение не создавало исключений, если оно заменяет только примитивы. Давайте класс, указывающий на буфер, который вам нужно скопировать:
Fixture::Fixture():m_data(), m_size() { }
Fixture::Fixture(const Fixture& f) {
m_data = new item[f.size()];
m_size = f.size();
std::copy(f.data(), f.data() + f.size(), m_data);
}
Fixture::~Fixture() { delete[] m_data; }
// note: the parameter is already the copy we would
// need to create anyway.
Fixture& Fixture::operator=(Fixture f) {
this->swap(f);
return *this;
}
// efficient swap - exchanging pointers.
void Fixture::swap(Fixture &f) {
using std::swap;
swap(m_data, f.m_data);
swap(m_size, f.m_size);
}
// keep this in Fixture's namespace. Code doing swap(a, b)
// on two Fixtures will end up calling it.
void swap(Fixture &a, Fixture &b) {
a.swap(b);
}
Вот так я обычно пишу оператор присваивания. Читать Хотите скорость? Передать по значению о необычной сигнатуре оператора присваивания (передать по значению).