Конструктор копирования и оператор присваивания обычно имеют очень похожий код, но если все сделано правильно (списки инициализаторов), то они должны кодироваться по-разному, использоваться по-разному и работать по-разному.
Конструктор копирования должен использовать списки инициализаторов.Это используется для создания нового векторного объекта , который совпадает с уже существующим.
vector::vector(const vector& b)
:size(b.size),
capacity(b.capacity),
data(new TYPE[size])
{
//there should be minimal code here
//I'm skipping copying the data, because doing it right
//is hard and beside the point
}
vector seven;
seven.push_back(7);
vector seven_copy(seven); //make a new one, same as old
Оператор присваивания, вероятно, именно то, что у вас есть.Это используется для переназначения уже существующего векторного объекта таким же, как уже существующий
vector& vector::operator=(const vector& b)
{
//carefully written so self assignment doesn't crash.
TYPE* temp = new TYPE[b.size];
//I'm skipping copying the data, because doing it right
//is hard and beside the point
delete [] data;
//all exceptions that can be thrown, have, so it's safe to modify members now
data = temp;
size = b.size;
capacity = b.capacity;
return *this;
}
vector nine;
nine.push_back(9);
nine = seven; //make an old one the same as another old
Следует отметить, что конструктор перемещения и назначение перемещения могут выглядеть примерно одинаково, нодолжно быть, вероятно, будет другим.
vector::vector(vector&& b)
:size(b.size)
capacity(b.capacity)
data(b.data) //different!
{
b.data = nullptr;
}
vector& operator=(vector&& b)
{
//since b.data is tied to b.size and b.capacity, it's safest to just swap
//so if someone calls b.push_back() after, it's all still safe.
std::swap(size, b.size);
std::swap(capacity, b.capacity);
std::data(data, b.data);
return *this;
}