为什么赋值操作符用于深度复制,谁调用它

Why assignment operator is used for deep copy and who calls it

本文关键字:调用 复制 赋值操作符 用于 深度 为什么      更新时间:2023-10-16

在深度复制过程中,我们编写了重载复制构造函数和赋值操作符。我可以知道为什么我们必须写重载赋值操作符,因为我们在重载复制构造函数中做同样的事情(除了一些检查和返回这个)。

谁在调用赋值运算符

遵循三原则:
如果需要为类编写复制构造函数,还应该编写复制赋值操作符析构函数

复制赋值操作符复制构造函数都称为复制函数。它们基本上有助于从现有对象中获取对象的新副本。它们都是在不同场景中调用的独立实体。因此,就像在Copy构造函数中确保对所有指针成员进行深拷贝而不仅仅是浅拷贝一样,复制赋值操作符也适用。

代码示例:

class MyClass obj1, obj2;
class MyClass obj3(obj1);     //Calls Copy Constructor
obj1 = obj2;                  //Calls Copy Assignment Operator

如果您这样做,则使用赋值操作符:

MyType my1, my2;
my1 = my2;  // same as: my1.operator=(my2);

复制构造函数和赋值操作符通常有非常相似的代码,但如果操作正确(初始化器列表),应该以不同的方式编码、使用和执行。

复制构造函数应该使用初始化列表。这用于创建一个新的向量对象,该对象与已经存在的对象相同。

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

应该注意的是,move构造函数和move赋值可能看起来模糊相似,但也应该有所不同。

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;
}