Почему оператор присваивания используется для глубокого копирования и кто его вызывает - PullRequest
1 голос
/ 13 сентября 2011

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

Кто вызывает оператор присваивания

Ответы [ 3 ]

5 голосов
/ 13 сентября 2011

Следуйте правилу трех :
Если вам нужно написать конструктор копирования для вашего класса, вы также должны написать Операторы присваивания копий и Деструктор .

Оператор назначения копирования и Конструктор копирования оба называются Функции копирования .Они в основном помогают в получении новой копии объекта из существующего объекта.Они оба являются отдельными объектами, вызываемыми в разных сценариях.Таким образом, так же, как и в случае конструктора Copy, вы гарантируете, что вы делаете глубокие копии всех элементов указателя, а не только полных копий, то же самое применимо к оператору присваивания копии.

2 голосов
/ 13 сентября 2011

Оператор присваивания используется, если вы делаете это:

MyType my1, my2;
my1 = my2;  // same as: my1.operator=(my2);
0 голосов
/ 13 сентября 2011

Конструктор копирования и оператор присваивания обычно имеют очень похожий код, но если все сделано правильно (списки инициализаторов), то они должны кодироваться по-разному, использоваться по-разному и работать по-разному.

Конструктор копирования должен использовать списки инициализаторов.Это используется для создания нового векторного объекта , который совпадает с уже существующим.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...